• P1002 过河卒


     P1002 过河卒

    题目描述

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

    棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过20的整数),同样马的位置坐标是需要给出的。

    现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1:
    6 6 3 3
    
    输出样例#1:
    6
    

    说明

    结果可能很大!

    起始点从(0,0)开始,为了方便,使起始点变成(1,1),终点也加一就行。

    动规,每一点是由左边或者上边来的,加起来。

    转移方程就是 f[i][j] = f[i-1][j] + f[i][j-1]

      1 #include<cstdio>
     2 #include<algorithm>
     3 
     4 using namespace std;
     5 const int N = 25 ;
     6 typedef long long ll; 
     7 int ex,ey,mx,my;
     8 ll f[N][N];
     9 bool mp[N][N];
    10 
    11 void init()
    12 {
    13     mp[mx][my] = true ;
    14     mp[mx-1][my-2] = true ;
    15     mp[mx-1][my+2] = true ;
    16     mp[mx-2][my-1] = true ;
    17     mp[mx-2][my+1] = true ;
    18     mp[mx+1][my+2] = true ;
    19     mp[mx+1][my-2] = true ;
    20     mp[mx+2][my+1] = true ;
    21     mp[mx+2][my-1] = true ;
    22 }
    23 int main()
    24 {
    25     scanf("%d%d%d%d",&ex,&ey,&mx,&my);
    26     init();
    27     f[1][0] = 1;
    28     for(int i=1;i<=ex+1;++i)
    29     {
    30         for(int j=1;j<=ey+1;++j)
    31         {
    32             f[i][j] = f[i-1][j]+f[i][j-1];
    33             if(mp[i-1][j-1]) f[i][j] = 0;
    34         }
    35     }
    36     printf("%lld",f[ex+1][ey+1]);
    37     return 0;
    38 }
  • 相关阅读:
    基于Python的人脸动漫转换
    let 与 var的区别
    【LeetCode】汇总
    【HDU】4632 Palindrome subsequence(回文子串的个数)
    【算法】均匀的生成圆内的随机点
    【LeetCode】725. Split Linked List in Parts
    【LeetCode】445. Add Two Numbers II
    【LeetCode】437. Path Sum III
    【LeetCode】222. Count Complete Tree Nodes
    【LeetCode】124. Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6868266.html
Copyright © 2020-2023  润新知