递推问题之马踏过河卒问题

problem

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入描述 Input Description

一行四个数据,分别表示B点坐标和马的坐标。

输出描述 Output Description

一个数据,表示所有的路径条数。

样例输入 Sample Input

6 6 3 3

样例输出 Sample Output

6

思路

如果用搜索的方法,每一个点都有向下向左两种方案。2的24次方是1e8级别的,所以这种方法很不好。

如果没有那些卒,从左上角到右下角是一个经典的组合问题,方案数为C(n+m,n)/C(n+m,m)。

现在问题是在表中会有一些障碍,经过这些障碍的方案都将舍去,这时候我们用递推的思想去解决。实际上,上面的组合数公式也是递推得到的结果(组合数本身也有递推方程):

由于卒只能向下或者向右走,那么想要到达棋盘上的一个点,有两种方式:从左边的格子过来,或者从上边的格子过来。所以,过河卒到达某点的路径数目等于到达与其相邻的左边点和上边点的路径数目和。我们用F(i,j) 来表示到达点 (i,j) 的路径数目。所以递推式为:F(i,j)=F(i-1,j)+F(i,j-1)。根据递推式发现,可以用逐行或逐列的递推方法求出从起点到终点的路径数目。对于边界条件,因为(0,0)是卒的起始位置,那么F(0,0) = 1。

这样先标记好障碍点,那么障碍点这一定Fi,j一定等于0,最终递推得到的Fn,m就是所求方案数了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=30;

ll  ans[maxn][maxn];
int vis[maxn][maxn];
int dir1[8]={1,1,2,2,-1,-1,-2,-2};
int dir2[8]={2,-2,1,-1,2,-2,1,-1};

int main()
{
    int n,m,cx,cy;
    cin>>n>>m>>cx>>cy;
    memset(vis,0,sizeof(vis));
    vis[cx][cy]=1;
    for(int i=0;i<8;++i){
        int a=cx+dir1[i];
        int b=cy+dir2[i];
        if(a>=0&&b>=0&&a<=n&&b<=n){
            vis[a][b]=1;
        }
    }
    ans[0][0]=1;
    for(int i=0;i<=n;++i){
        for(int j=0;j<=m;++j){
            if(i){
                if(vis[i][j]) ans[i][j]=0;
                else ans[i][j]+=ans[i-1][j];
            }
            if(j){
                if(vis[i][j]) ans[i][j]=0;
                else ans[i][j]+=ans[i][j-1];
            }
        }
    }
    cout<<ans[n][m]<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/qiucomeon/p/9692103.html

时间: 2024-11-08 16:52:22

递推问题之马踏过河卒问题的相关文章

马拦过河卒心得体会

题目棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒". 棋盘用坐标表示,A点(0, 0).B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的.现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步. 输入一行四个数据,分别表示B点坐标和马的坐标.(保证所有的数据有解) 输出一个数据

【回溯法】马拦过河卒

问题 I: [回溯法]马拦过河卒 时间限制: 1 Sec  内存限制: 128 MB提交: 43  解决: 13[提交][状态][讨论版] 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. 棋盘用坐标表示,A点(0, 0).B点(n, m)(n, m为不超过20的整数),同样马的位置坐标是需要给出的.现在要求你计算出卒从A点能够到达B点的路径的条数

NOIP 马拦过河卒

描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. 棋盘用坐标表示,A点(0, 0).B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的.现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步. 格式 输入格式 一行四个数据,分别表示B点坐标和马的坐标. 输出格式 一个数据,表示所有的

NOIP 2002 马拦过河卒 BFS+递推

Description : 如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右. 同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为方马的控制点.例如上图C点上的马可以控制9个点(图中的P1,P2...P8和C).卒不能通过对方的控制点. 棋盘用坐标表示,A点(0,0).B点(n, m)(n,m为不超过20的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定:C≠A,同时C≠B).现在要求你计算出卒从A点能够到达B点的路 径的

Vijos 1121 马拦过河卒

首先要看清题目,卒只能向右或者向下走.而不是四周转.这样的话就无解了. 定义f[i][j],表示走到(i,j)这个点时的总步数.这样就写出了一个递推公式f[i][j]=f[i-1]+f[i][j-1].因为卒是从(0,0)出发,所以f[0][0]=1,因为 f[i][j]只能从前一个状态转移过来.所以在转移前需要加特判即(i-1,j)和(i,j-1)两点不是马所控制的点.所以在递推之前还应有一个预处理.来处理马所能控制的点,预处理很好写.剩下的没有什么了.输出目标节点的 f 值即可. 代码: #

【动态规划】Vijos P1121 马拦过河卒

题目链接: https://vijos.org/p/1616 题目大意: 卒从(0,0)走到(n,m),只能向下或向右,不能被马一步碰到或走到马,有几种走法. 题目思路: [动态规划] 把马控制的地方全部标记,接下来DP,f[i][j]=f[i-1][j]+f[i][j-1]; 1 // 2 //by coolxxx 3 //#include<bits/stdc++.h> 4 #include<iostream> 5 #include<algorithm> 6 #inc

递推2--过河卒(Noip2002)

递推2--过河卒(Noip2002) 一.心得 写出递推公式就OK了,具体编程还是很简单的 二.题目及分析 过河卒(NOIp2002) [问题描述] 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒". 棋盘用坐标表示,A点(0, 0).B点(n, m),(n, m为不超过20的整数),同样马的位置坐标是需要给出的.C≠A且C≠B.现在要求你计算出卒从

AC日记——过河卒 洛谷 1002

题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. 棋盘用坐标表示,A点(0, 0).B点(n, m)(n, m为不超过20的整数),同样马的位置坐标是需要给出的. 现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步. 输入输出格式 输入格式: 一行四个数据,分别表示B点坐标和马的坐标. 输出格式: 一

【水】noip2002普及 过河卒

这题似乎是当年的马拦过河卒,好久的回忆啊... 过河卒 来源 NOIP2002普及组 题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例 如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C).卒不能通过对方马的控制点. 棋盘用坐标表示,A 点(0,0).B 点(n,m)(n,m 为不超过 25 的整数,并由键盘输入),同样马的