解题思路:
用一个二维数组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 ",f[x1][y1]); 25 } 26 return 0; 27 }