0
已解决
while
高级光能
高级光能
4507 马走棋盘
经验值:1600 时间限制:1000毫秒
题目描述 Description
现在有一个大小为m * n的棋盘,棋盘的左上角(0,0)有一个象棋棋子——马(马在象棋中,只能走“日”),棋盘上另一个位置(x,y)有一个敌方的车。现在马想从棋盘的左上角走到棋盘的右下角(m,n),但是不能落在车的同一行或者同一列(会被车吃掉),且马只能往右走不能往左走。请你编写一个程序,计算马有多少种不同的路径到达棋盘的右下角。
输入描述 Input Description
两行,第一行两个整数m、n、x、y,分别表示棋盘的行、列和车所在的行、列
输出描述 Output Description
一个整数,表示共有多少种不同的路径
样例输入 Sample Input
7 7 4 4
样例输出 Sample Output
1
数据范围及提示 Data Size & Hint
2<=m, n<=20
2<=x<=m
2<=y<=n
#include <iostream>
using namespace std;
int dir[4][2] = {{2, 1}, {1, 2}, {-1, 2}, {-2, 1}};
int cnt;
bool vis[25][25];
int n, m, ex, ey;
int a[10], b[10];
void dfs(int x, int y) {
if (x == n && y == m) {
cnt ++;
return ;
}
int i = 0;
do {
int nx = x + dir[i][0], ny = y + dir[i][1];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && nx != ex && ny != ey) {
dfs(nx, ny);
}
i ++;
} while (i < 4);
}
int main() {
cin >> n >> m >> ex >> ey;
dfs(1, 1);
cout << cnt;
return 0;
}
为什么输出2??
@王文博
0
已采纳
李显晨
中级启示者
中级启示者
我给个递推式吧
if(i==x||j==y) f[i][j]=0;
else if(i==0&&j==0) f[i][j]=1;
else{
if(i-2>=0&&j-1>=0) f[i][j]+=f[i-2][j-1];
if(i-1>=0&&j-2>=0) f[i][j]+=f[i-1][j-2];
if(i+1>=0&&j-2>=0) f[i][j]+=f[i+1][j-2];
if(i+2>=0&&j-1>=0) f[i][j]+=f[i+2][j-1];
}
李显晨在2021-07-19 18:29:22追加了内容
???
0
0
李显晨
中级启示者
中级启示者
算了,循环都给你吧
cin>>m>>n>>x>>y;
for(int j=0;j<=n;j++){
for(int i=0;i<=m;i++){
if(i==x||j==y) f[i][j]=0;
else if(i==0&&j==0) f[i][j]=1;
else{
if(i-2>=0&&j-1>=0) f[i][j]+=f[i-2][j-1];
if(i-1>=0&&j-2>=0) f[i][j]+=f[i-1][j-2];
if(i+1>=0&&j-2>=0) f[i][j]+=f[i+1][j-2];
if(i+2>=0&&j-1>=0) f[i][j]+=f[i+2][j-1];
}
}
}
cout<<f[m][n];
李显晨在2021-07-19 18:31:12追加了内容
@while