过河卒
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 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的横纵坐标搞混;
我就死在了这两点上。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }