代码
#include <stdio.h>
long long map[21][21];
bool flag[21][21];
int arr[9][2]={
0,0,
-2,-1,
-1,-2,
1,-2,
2,-1,
1,2,
2,1,
-1,2,
-2,1
};
int main()
{
int n,m,cx,cy;
scanf("%d%d%d%d",&n,&m,&cx,&cy);
for(int i=0;i<9;i++){
int x=cx+arr[i][0];
int y=cy+arr[i][1];
if(x>=0&&x<=n&&y>=0&&y<=m){
flag[x][y]=true;
map[x][y]=0;
}
}
for(int i=n;i>=0;i--)
{
for(int j=m;j>=0;j--)
{
if(flag[i][j]==false){
if(i==n||j==m)map[i][j]=1;
else
{
map[i][j]=map[i+1][j]+map[i][j+1];
}
}
}
}
/*for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
printf("%lld ",map[i][j]);
}
printf("\n");
}*/
printf("%lld\n",map[0][0]);
}
解题思路:
典型的动态规划问题,因为棋子只能向下或向右走,所以每个点到达终点的路径数=右方节点路径数+下方节点路径数。
该题注意点:
1.棋子“马”本身节点也是控制节点。
2.棋盘路径数初始化时,最右方和最下方一行初始为1,棋子“马”所控制的节点初始化为0.
3.个别测试用例最终答案超过int范围,使用long long型数据进行计算与输出