马拦过河卒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 }

 

posted @ 2020-06-06 11:31  爱写程序的机械师  阅读(218)  评论(0)    收藏  举报