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
0