[ 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 }