P1644 跳马问题

题目背景

在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧……

题目描述

中国象棋半张棋盘如图 11 所示。马自左下角 (0,0)(0,0) 向右上角 (m,n)(m,n) 跳。规定只能往右跳,不准往左跳。比如图 11 中所示为一种跳行路线,并将路径总数打印出来。

输入格式

只有一行:两个数 nn,mm。

输出格式

只有一个数:总方案数 totaltotal。

输入输出样例

输入 #1复制

4 8

输出 #1复制

37

说明/提示

对于 100\%100% 的数据:n, m\leq 18n,m≤18

题目类型:dfs , dp, 模拟

解题思路:(dfs)马要到达(n,m)点就要向上向右行动, 在本题中 若某点(i,j)在通过

(i+1, j+2),(i+2, j+1),(i-1, j+2),(i-2,j+1)等操作后能到达(n,m)点则,可能路径数加一

        (dp)用 dp[x][y] 记录到当前点(x,y)的可能路径数,递推公式为:

                                dp[x][y] = dp[x-1][y-2]+dp[x-2][y-1]+dp[x+1][y-2]+dp[x+2][y-1];

AC代码:

#include <bits/stdc++.h>
#define rep(x, a, b) for(int x = a; x<=b; x++)
#define pre(x, a, b) for(int x=a; x>=b; x--)
using namespace std;
const int N = 2e6+20;
int dx[5] = {0, -2, -1, 1, 2};
int dy[5] = {0, 1, 2, 2, 1};//本题中horse 只能向上的四个方向走。
int board[20][20];
int cot;
int n, m;
void dfs(int x, int y)
{
    if(x == n && y == m)
    {
        cot++; return;
    }
    else
        rep(i, 1, 4)
            if(x>=0 && x<= n && y>=0 &&  y<=m)
                dfs(x+dx[i], y+dy[i]);
}
int main()
{
    scanf("%d%d", &n, &m);
    dfs(0, 0);
    cout<<cot;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_54674275/article/details/121368213
今日推荐