问题标题: 酷町堂:4507 马走棋盘

0
0
已解决
while
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 

 

我要回答