递推递归练习 L 马拦过河卒

来源:互联网 发布:免费服务器防火墙软件 编辑:程序博客网 时间:2024/06/04 23:30

Description

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

Input

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

Output

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

Sample Input

6 6 3 3

Sample Output

6

这道题我做了好长好长时间,有些动态规划的思想

如要到达a[1][2]只能从a[0][2]或a[1][1]过来,到a[1][1]有两条路(到a[1][1]的两条是到a[0][1]的一条与到a[1][0]的一条加起来得到的,以此类推),到a[0][2]有一条,加起来就是三条。

实现的时候可以将马的控制点设为0,或遇马的控制点就跳过循环。代码如下:

#include <iostream>using namespace std;int a[21][21] = {0};int main(){        int i, j, m, n, x, y;        cin>>n>>m>>x>>y;        a[x][y]=-1;        if(x - 1 >= 0 && y - 2 >= 0) a[x-1][y-2] = -1;        if(x - 2 >= 0 && y - 1 >= 0) a[x-2][y-1] = -1;        if(x - 2 >= 0 && y + 1 <= m-1) a[x-2][y+1] = -1;        if(x - 1 >= 0 && y + 2 <= m-1) a[x-1][y+2] = -1;        if(x + 1 <= n && y + 2 <= m) a[x+1][y+2] = -1;        if(x + 2 <= n && y + 1 <= m) a[x+2][y+1] = -1;        if(x + 2 <= n && y - 1 >= 0) a[x+2][y-1] = -1;        if(x + 1 <= n && y - 2 >= 0) a[x+1][y-2] = -1;        for(i = 0; i <= n; i++)        {                for(j=0;j<=m;j++)                {                        if(a[i][j]==-1) continue;                        if(i==0&&j==0)                        {                                a[i][j]=1;                                continue;                        }                        a[i][j]=0;                        if(j-1>=0&&a[i][j-1]!=-1)                                a[i][j]+=a[i][j-1];                        if(i-1>=0&&a[i-1][j]!=-1)                                a[i][j]+=a[i-1][j];                }        }        if(a[n][m] == -1)                 cout << 0;        else                 cout << a[n][m];}

0 0
原创粉丝点击