问题标题: 酷町堂:各位dalao们,这题5102错在哪,麻烦帮忙看看

0
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
周zhouhaoran
周zhouhaoran
初级光能
初级光能

太难了,建议打好基础,要用动规

我要回答