ACM 马拦过河卒(动态规划)

解题思路:

用一个二维数组a[i][j]标记 马的位置和马的跳点(统称控制点)该位置=1;

再用一个二维数组f[i][j]表示行进的位置,如果前一行的当前列不是马的控制点,或者前一列的当前行不是马的控制点,则说明是可走的,

f[i][j]+=f[i-1][j];  f[i][j]+=f[i][j-1];

最后输出 f[目标x][目标y] 

AC code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[16][16],f[16][16];
 4 int x[8]= {1,2,2,1,-1,-2,-2,-1};
 5 int y[8]= {2,1,-1,-2,-2,-1,1,2};
 6 int main()
 7 {
 8     int x1,y1,x2,y2;
 9     while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2)!=EOF)
10     {
11         a[x2][y2]=1;
12         for(int i=0; i<=7; i++)
13             if(x2+x[i]<=x1&&y2+y[i]<=y1)
14                 a[x2+x[i]][y2+y[i]]=1;
15         f[0][0]=1;
16         for(int i=0; i<=x1; i++)
17             for(int j=0; j<=y1; j++)
18             {
19                 if(i>0&&!a[i-1][j])
20                     f[i][j]+=f[i-1][j];
21                 if(j>0&&!a[i][j-1])
22                     f[i][j]+=f[i][j-1];
23             }
24         printf("%d\n",f[x1][y1]);
25     }
26     return 0;
27 }

 

posted @ 2016-08-18 11:01  马丁黄瓜啊  阅读(508)  评论(0编辑  收藏  举报