过河卒
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
1 #include<stdio.h> 2 int bx,by; 3 int hx,hy; 4 float dp[50][50]; 5 float pro; 6 int main() 7 { 8 freopen("a.txt","r",stdin); 9 int i,j; 10 while(scanf("%d%d%d%d",&bx,&by,&hx,&hy)==4) 11 { 12 pro=1; 13 14 for(i=0;i<=by;i++) 15 for(j=0;j<=bx;j++) 16 { 17 dp[i][j]=1; 18 } 19 printf("%d %d\n",hx,hy); 20 for(j=0;j<=bx+1;j++) 21 dp[by+1][j]=-1; 22 for(j=0;j<=by+1;j++) 23 dp[j][bx+1]=-1; 24 dp[hx-2][hy+1]=dp[hx-1][hy+2]=dp[hx][hy]=dp[hx+1][hy+2]=dp[hx+2][hy+1]=dp[hx-2][hy-1]=dp[hx-1][hy-2]=dp[hx+1][hy-2]=dp[hx+2][hy-1]=-1; 25 printf("%.0f\n",dp[hx-1][hy-2]); 26 printf("%d %d\n",hx-1,hy-2); 27 /* for(i=0;i<=by;i++) 28 for(j=0;j<=bx;j++) 29 { 30 if(dp[i][j]==-1) 31 break; 32 if(dp[i+1][j]!=-1&&dp[i][j+1]!=-1) 33 dp[i][j]=2; 34 if((dp[i+1][j]!=-1&&dp[i][j+1]==-1)||(dp[i][j+1]!=-1&&dp[i+1][j]==-1)) 35 dp[i][j]=1; 36 if(dp[i+1][j]==-1&&dp[i][j+1]==-1) 37 dp[i][j]=0.5; 38 pro*=dp[i][j]; 39 printf("dp[%d][%d]=%.0f\n",i,j,dp[i][j]); 40 41 } 42 printf("%.0f\n",pro); */ 43 for(i=0;i<=by+1;i++) 44 { 45 printf("\n"); 46 for(j=0;j<=bx+1;j++) 47 printf("%-4d",dp[i][j]); 48 } 49 } 50 return 0; 51 } 52 53
时间: 2024-08-07 17:09:20