马拦过河卒sdut
Description
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
Input
一行四个数据,用空格分隔,分别表示B点的坐标和马的坐标。
Output
一个数据,表示所有的路径条数。
Sample
Input
6 6 3 3
Output
6
其实很好想,主要思路就是开两个二维数组,分别存放被马控制的点和路径的个数。
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 int dx[8] = {2,1,-1,-2,-2,-1,1,2}; 6 int dy[8] = {1,2,2,1,-1,-2,-2,-1};//给被马控制的9个点赋值 7 int g[20][20]; 8 int f[20][20]; 9 memset(g,0,sizeof(g)); 10 memset(f,0,sizeof(f)); 11 int a,b,m,n; 12 scanf("%d%d%d%d",&a,&b,&m,&n); 13 int i,j; 14 g[m][n] = 1; 15 f[0][0] = 1; 16 for(i=0; i<8; i++) 17 { 18 if(m+dx[i]>=0 && n+dy[i]>=0 )//保证没有过边界,过了边界那个点就不存在了 19 g[m+dx[i]][n+dy[i]] = 1; 20 } 21 for(i=1; i<=a; i++) //行赋值。 22 { 23 if(g[i][0] == 0)//如果不是马的控制点 24 f[i][0] = 1;//表示有一条路可以走到,因为是边界所以只有一条路 25 else//如果有一个点走不通了,那后面的就不用继续了,肯定走不通了。 26 break; 27 } 28 for(i=1; i<=b; i++) //列赋值 29 { 30 if(!g[0][i])//当然也可以通过非0即是true进行赋值 31 f[0][i] = 1; 32 else 33 break; 34 } 35 for(i=1; i<=a; i++) 36 for(j=1; j<=b; j++) //最左端和最下端的全部都已经赋值,所以起点应该从(1,1)开始 37 { 38 if(g[i][j] == 0) 39 f[i][j] = f[i-1][j] + f[i][j-1]; 40 } 41 printf("%d\n",f[a][b]); 42 return 0; 43 }

浙公网安备 33010602011771号