过河卒

来源:互联网 发布:天庭淘宝城txt全集下载 编辑:程序博客网 时间:2024/04/27 22:28

Problem Description

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点(马走日字),卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B点(n, m) (n,m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。现在要求你计算出卒从A点能够到达B点的路径的条数。

Input

输入有多组数据,对于每组数据只有一行,分别为B的坐标n,m和马的坐标。

Output

对于每组输入,输出从A点能够到达B点的路径的条数。

Sample Input

8 6 0 4

Sample Output

1617
/*
            解题报告:赋初值:dp[bx][by]=0; 第bx行和第by列赋值为1,在马的位置
                           和它能拓展的位置做标记,其余的以B点为起点到(0,0)进行DP;
                           转移方程:dp[i][j]=dp[i+1][j]+dp[i][j+1];  (i:bx to 0,   j: by to 0)
*/
//标程:
#include<stdio.h>#include<string.h>
__int64 dp[30][30];int bx,by,cx,cy;int dir[8][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};void f(int x,int y){    int i,x1,y1;    for(i=0;i<8;i++)    {        x1=x+dir[i][0], y1=y+dir[i][1];        if(x1>=0 && x1<=bx && y1>=0 && y1<=by)           dp[x1][y1]=-1;    }}int main(){    //freopen("a.txt","r",stdin);    int i,j,k;    while(scanf("%d%d%d%d",&bx,&by,&cx,&cy)!=EOF)    {        memset(dp,0,sizeof(dp));        dp[bx][by]=0;        dp[cx][cy]=-1;        f(cx,cy);        for(i=bx-1;i>=0;i--)              if(dp[i][by]!=-1) dp[i][by]=1;        for(i=by-1;i>=0;i--)             if(dp[bx][i]!=-1) dp[bx][i]=1;        for(i=bx-1;i>=0;i--)        {            for(j=by-1;j>=0;j--)            {                if(dp[i][j]!=-1)                {                    if(dp[i+1][j]!=-1 && dp[i][j+1]!=-1) dp[i][j]=dp[i][j+1]+dp[i+1][j];                     else if(dp[i+1][j]==-1) dp[i][j]=dp[i][j+1];                    else if(dp[i][j+1]==-1)  dp[i][j]=dp[i+1][j];                }            }        }        printf("%I64d\n",dp[0][0]);    }    return 0;}
原创粉丝点击