[ CodeVS冲杯之路 ] P1010

  不充钱,你怎么AC?

  题目:http://codevs.cn/problem/1010/

 

  首先我们将坐标都+1,因为它是从(0,0)开始的

  预处理出禁区,也就是马能到达的格子和马自己的格子,标上记号

  直接开始转移

  

  把 f[0][1] 或者 f[1][0] 赋上1,这样 f[1][1] 就能正常转移

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define N 17
 8 using namespace std;
 9 
10 const int xx[8]={1,2,-1,-2,-1,-2,1,2},
11           yy[8]={2,1,-2,-1,2,1,-2,-1};
12 int f[N][N],n,m;
13 bool g[N][N];
14  
15 int main()
16 {
17     int x,y,i,j;
18     scanf("%d%d%d%d",&n,&m,&x,&y);
19     n++;
20     m++;
21     x++;
22     y++;
23     for (i=1;i<=n;i++)
24     {
25         for (j=1;j<=m;j++) g[i][j]=0;
26     }
27     for (i=0;i<8;i++)
28     {
29         if (x+xx[i]<=n&&x+xx[i]>0&&y+yy[i]<=m&&y+yy[i]>0) g[x+xx[i]][y+yy[i]]=1;
30     }
31     g[x][y]=1;
32     f[0][1]=1;
33     for (i=1;i<=n;i++)
34     {
35         for (j=1;j<=m;j++)
36         {
37             if (g[i][j]) continue;
38             f[i][j]=f[i-1][j]+f[i][j-1];
39         }
40     }
41     printf("%d\n",f[n][m]);
42     return 0;
43 }

 

posted @ 2016-09-17 20:32  Hadilo  阅读(197)  评论(0编辑  收藏  举报