P1002 过河卒
题目描述
棋盘上AAA点有一个过河卒,需要走到目标BBB点。卒行走的规则:可以向下、或者向右。同时在棋盘上CCC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,AAA点(0,0)(0, 0)(0,0)、BBB点(n,m)(n, m)(n,m)(nnn, mmm为不超过202020的整数),同样马的位置坐标是需要给出的。
现在要求你计算出卒从AAA点能够到达BBB点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入格式
一行四个数据,分别表示BBB点坐标和马的坐标。
输出格式
一个数据,表示所有的路径条数。
输入输出样例
   输入 #1  
  6 6 3 3
  输出 #1 
  6
说明/提示
结果可能很大!
思路:标记🐎的位置和🐎能走到的点建图,与🐎有关的位置点上可走的路线条数一定是0。
根据当前点状态可分为边界状态和非边界状态两种情况。
边界态:当x!=0,y==0时,该点状态dp[x][y]=dp[x-1][y],同理,x==0,y!=0时,dp[x][y]=dp[x][y-1]。
非边界态:当x>0,y>0即走在棋盘内部时,状态dp[x][y]=dp[x-1][y]+dp[x][y-1]。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 25;
typedef long long LL;
LL dp[maxn][maxn];
LL maze[maxn][maxn];
LL n,m,x,y,ans;
int main()
{
    while(scanf("%lld%lld%lld%lld",&n,&m,&x,&y)!=EOF)
    {
        memset(maze,0,sizeof(maze));
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=m;j++)
            {
                if((i==x&&j==y))
                {
                    maze[i][j]=0;
                }
                else if(i==x-2&&j==y-1) maze[i][j]=0;
                else if(i==x-1&&j==y-2) maze[i][j]=0;
                else if(i==x+1&&j==y-2) maze[i][j]=0;
                else if(i==x+2&&j==y-1) maze[i][j]=0;
                else if(i==x-2&&j==y+1) maze[i][j]=0;
                else if(i==x-1&&j==y+2) maze[i][j]=0;
                else if(i==x+1&&j==y+2) maze[i][j]=0;
                else if(i==x+2&&j==y+1) maze[i][j]=0;
                else
                    maze[i][j]=1;
               // printf("%d ",maze[i][j]);
            }
            //printf("\n");
        }
        //printf("\n");
        //memset(dp,0,sizeof(dp));
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=m;j++)
            {
                if(maze[i][j]){
                    if((i==0&&j==0))
                        continue;
                    else if(i==0)
                    {
                        maze[i][j]=maze[i][j-1];
                    }
                    else if(j==0)
                    {
                        maze[i][j]=maze[i-1][j];
                    }
                    else
                        maze[i][j]=maze[i-1][j]+maze[i][j-1];
                    //printf("dp[%d][%d]:%d\n",i,j,maze[i][j]);
                }
                //printf("%d ",maze[i][j]);
            }
           // printf("\n");
        }
        printf("%lld\n",maze[n][m]);
    }
    return 0;
}
   

京公网安备 11010502036488号