问题标题: 酷町堂:4507

0
0
已解决
周明轩
周明轩
资深光能
资深光能

题目描述 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<bits/stdc++.h>
using namespace std;
int f[25][25];
int dis[6][2]={
	{2,1},{2,-1},{1,2},{-1,2},{1,-2},{-1,-2}
	
};
int main(){
    int n,m,x,y;
    cin>>n>>m>>x>>y;
	f[0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(i==x||j==y){
            	continue;
			}
			for(int k=0;k<6;k++){
		    	int dx=x+dis[k][0],dy=y+dis[k][1];
		    	if(dx>=0&&dx<=n&&dy>=0&&dy<=m){
		    		f[i][j]+=f[dx][dy];
				}
			}
        }
    }
	cout<<f[n][m];
    return 0;
}

哪错了

 

周明轩在2020-08-06 15:46:14追加了内容

代码发错了,是这个

#include<bits/stdc++.h>
using namespace std;
int f[25][25];
int main(){
    int n,m,x,y;
    cin>>n>>m>>x>>y;
    f[0][0]=1;
    for(int i=0;i<=n;i++){
        for(int j=0;j<=m;j++){
            if(i==0&&j==0||i==x||j==y){
            	continue;
            }
            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-2>=0&&j+1<=m){
                f[i][j]+=f[i-2][j+1];
            }
            if(i-1>=0&&j+2<=m){
                f[i][j]+=f[i-1][j+2];
            }
        }
    }
    cout<<f[n][m];
    return 0;
}

 

周明轩在2020-08-06 16:02:31追加了内容

ding

周明轩在2020-08-06 16:10:51追加了内容

ding

周明轩在2020-08-06 16:28:21追加了内容


0
已采纳
黄子扬
黄子扬
初级天翼
初级天翼

马有八个方向。。

黄子扬在2020-08-06 15:43:19追加了内容

那就是四个方向啊。。。

黄子扬在2020-08-06 15:46:58追加了内容

不是,这不是应该dfs吗

0
0
0
0
0
董宇昊
董宇昊
初级启示者
初级启示者

被禁言也可以发问题吗?

0
王文博
王文博
缔造者之神
缔造者之神

我认为这是他在被禁言之前发的吧

0
王泽宇
王泽宇
初级光能
初级光能

哎,作业哎

王泽宇在2020-08-06 16:50:34追加了内容

敢问

王泽宇在2020-08-06 16:50:39追加了内容

敢问

0
我要回答