rocky_taolei 2025-04-08 22:04 采纳率: 0%
浏览 11

C++过河车求解,用递推

题目描述 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
357462
数据范围及提示 Data Size & Hint
0<=m,n<=10
0<=x<=n
0<=y<=m

  • 写回答

3条回答 默认 最新

  • rocky_taolei 2025-04-08 22:05
    关注
    
    #include<bits/stdc++.h>
    using namespace std;
    /*
    数组含义
    f:从f[0][0]到达f[i][j]的方案数。
    g:是否是卒的攻击范围。
    递推关系
    for(int a=0;a<=i-1;a++){//横向
        f[i][j]+=f[a][j];
    }
    for(int b=0;b<=j-1;b++){//纵向
        f[i][j]+=f[i][b];
    }
    边界
    f[0][0]=1;
    */
    int n,m,x,y;
    int f[15][15],g[15][15];
    int main(){
        cin>>n>>m>>x>>y;
        g[x][y]=1;
        g[x][y-1]=1;
        g[x][y+1]=1;
        g[x+1][y]=1;
        g[x-1][y]=1;
        f[0][0]=1;
        for(int i=0;i<=n;i++){
            for(int j=0;j<=m;j++){
                if(g[i][j]==1){
                    continue;
                }
                for(int a=0;a<=i-1;a++){//横向
                    f[i][j]+=f[a][j];
                }
                for(int b=0;b<=j-1;b++){//纵向
                    f[i][j]+=f[i][b];
                }
            }
        }
        cout<<f[n][m];
        return 0;
    }
    
    

    这是80分的代码

    评论

报告相同问题?

问题事件

  • 创建了问题 4月8日