过河卒

 过河卒

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 941  Solved: 206

Description

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图中的C点和P1,……,P8,卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B点(n, m) (n,m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。现在要求你计算出卒从A点能够到达B点的路径的条数。
           1   2   3   4   5   6   7    8
     A +---+---+---o---+---o---+---+----+--------->Y
       |   |   |   |   |   |   |   |    |
     1 +---+---o---+---+---+---o---+----+
       |   |   |   |   |   |   |   |    |
     2 +---+---+---+---C---+---+---+----+
       |   |   |   |   |   |   |   |    |
     3 +---+---o---+---+---+---o---+----+
       |   |   |   |   |   |   |   |    |
     4 +---+---+---o---+---o---+---+----+ B(4,8)
       |
       |
       V

       X

Input

多个测试案例,每个案例一行,处理到文件末尾 B点坐标(n,m)以及对马的坐标(X,Y){不用判错}

Output

一个整数(路径的条数)

Sample Input

6 6 3 2 

Sample Output

17

 这道题本来能算是我的第一个AC的DP,.......要注意两点:1,dp数组用long long来申明;2,别把B的横纵坐标搞混;

我就死在了这两点上。

 1 #include<stdio.h>
 2 int bx,by;
 3 int hx,hy;
 4 long long dp[50][50];
 5 int main()
 6 {
 7     //freopen("a.txt","r",stdin);
 8     int i,j;
 9     while(scanf("%d%d%d%d",&by,&bx,&hx,&hy)==4)
10     {
11 
12         for(i=0;i<=by+1;i++)
13             for(j=0;j<=bx+1;j++)
14             {
15                 dp[i][j]=0;
16             }
17         dp[hx-2+1][hy+1+1]=dp[hx-1+1][hy+2+1]=dp[hx+1][hy+1]=dp[hx+1+1][hy+2+1]=dp[hx+2+1][hy+1+1]=dp[hx-2+1][hy-1+1]=dp[hx-1+1][hy-2+1]=dp[hx+1+1][hy-2+1]=dp[hx+2+1][hy-1+1]=-1;
18 
19         dp[1][1]=1;
20         for(i=1;i<=by+1;i++)
21             for(j=1;j<=bx+1;j++)
22             {
23                 if(dp[i][j]==-1)
24                     continue;
25                 dp[i][j]+=dp[i-1][j]+dp[i][j-1];
26                 if(dp[i-1][j]==-1)
27                     dp[i][j]+=1;
28                 if(dp[i][j-1]==-1)
29                     dp[i][j]+=1;
30             }
31       /*  for(i=0;i<=by+1;i++)
32         {
33             printf("
");
34             for(j=0;j<=bx+1;j++)
35                 printf("%-5lld",dp[i][j]);
36         }
37         printf("
");*/
38         printf("%lld
",dp[by+1][bx+1]);
39     }
40     return 0;
41 }
View Code
原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/4181146.html