0
已解决
刘宇唐
中级守护
中级守护
5102 过河车经验值:1600
题目描述 Description
小卒在过河的过程中遇到了马的围追堵截,艰难的来到了终点。现在他的老大,车也打算过河。
在一个n×m的棋盘上,左上角(0,0)处有一只象棋中的车。在某个位置(x,y)处有一个马。现在车朝着右下角(n,m)位置前进,但是前进的过程中不能走到马所在的点,以及马控制的那些位置。并且车每次只能朝着右方或下方前进。试求出车有多少种方案到达右下角。
输入描述 Input Description
一行,四个空格隔开的整数,n m x y
输出描述 Output Description
车到达右下角的方案数
样例输入 Sample Input
8 6 0 4
样例输出 Sample Output
266962
数据范围及提示 Data Size & Hint
0<=m,n<=10
/*
状态:
f[i][j] 到达(i,j)的方案数
状态转移方程:
f[i][j]=f[i+1~n][j]+f[i][j+1~n];
边界:
f[0][0]=1;
目标:
f[n][m];
*/
#include<iostream>
using namespace std;
int dir[9][2]={{0},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
bool vis[11][11];
int f[11][11];
int n,m,x,y;
int main(){
cin>>n>>m>>x>>y;
for(int i=0;i<=8;i++){
int dx=x+dir[i][0],dy=y+dir[i][1];
if(dx>=0&&dy>=0&&dx<=n&&dy<=m)
vis[dx][dy]=true;
}
f[0][0]=1;
for(int j=0;j<=m;j++){
for(int i=0;i<=n;i++){
if(vis[i][j]==true)
continue;
for(int k=i+1;k<=n;k++){
f[k][j]+=f[i][j];
}
for(int k=j+1;k<=m;k++){
f[i][k]+=f[i][j];
}
}
}
cout<<f[n][m];
return 0;
}
0
已采纳
蒋文瀚
新手光能
新手光能
第29行至34行×
1.28行和29行中间增加else
2.30行改为f[i][j]+=f[k][j];
3.33行改为f[i][j]+=f[i][k];
0
李秉轩
修练者
修练者
29-34改为
if(vis[i][j]==true)
continue;
for(int k=0;k<=i-1;k++){
f[i][j]+=f[k][j];
}
for(int k=0;k<=j-1;k++){
f[i][j]+=f[i][k];
}
0
0
张帆
中级天翼
中级天翼
30行和33行两个参数的位置分别写反了,
应该为
for(int k=i+1;k<=n;k++){
f[i][j]+=f[k][j];
}
for(int k=j+1;k<=m;k++){
f[i][j]+=f[i][k];
}
0
0
0