题目:
Description
中国象棋大家都玩过吧!!! 现在有只小马迷路了,它现在在0,0位置,它的家在m,n位置(棋盘大小为m*n), 现规定小马只能往右走,请聪明的你帮帮小马算一下回到家有几种方案?
注意:
(0,0)点在左下角,(m,n)在右上角,
棋盘内所有点的坐标(x,y)满足x>=0&&x<=n&&y>=0&&y<=m
Format
Input
家的位置m,n 比如4,8 1=<m,n<=200。
Output
一个整数即方案数
Samples
【输入样例】
输入数据 1
4 8
输出数据 1
37
【输出样例】
Limitation
1s, 1024KiB for each test case.
思路:
这道题,看起来非常的恶心,但是有万能的dfs(深度优先算法),还有什么好怕的?Oh,记得别忘了加上记忆化和回溯哦~~~
奉上代码:
#include <bits/stdc++.h>
using namespace std;
int m, n, ans;
bool f[210][210];//模拟棋盘上的每一点,0表示走过,1表示没走过
bool p(int x, int y) {//判断边界
if (0 <= x && x <= n && 0 <= y && y <= m)
return 1;
return 0;
}
void dfs(int x, int y) {//深度优先算法(即dfs)
if (x == n && y == m) {//如果走到终点,那方法数加一
ans++;
cout<<endl;
return ;
}
cout<<x<<" "<<y<<endl;
if (x > n)
return ;
//以下四步:判断是否出界和是否走过,如果都没有,打上标记表示走过,递归 ,回溯(标记)
if (!f[x + 1][y + 2] && p(x + 1, y + 2));
{
f[x + 1][y + 2] = 1;
dfs(x + 1, y + 2);
f[x + 1][y + 2] = 0;
}
if (!f[x + 2][y + 1] && p(x + 2, y + 1)) {
f[x + 2][y + 1] = 1;
dfs(x + 2, y + 1);
f[x + 2][y + 1] = 0;
}
if (!f[x - 2][y + 1] && p(x - 2, y + 1)) {
f[x - 2][y + 1] = 1;
dfs(x - 2, y + 1);
f[x - 2][y + 1] = 0;
}
if (!f[x - 1][y + 2] && p(x - 1, y + 2)) {
f[x - 1][y + 2] = 1;
dfs(x - 1, y + 2);
f[x - 1][y + 2] = 0;
}
}
int main() {
cin >> n >> m;
dfs(0, 0);
cout << ans << endl;
return 0;
}