写的C,而且很繁琐(泣) 基础不牢是这样的,不过AC了还是很开心 这道题有三个点要注意吧, 一是给0行和0列赋值1的时候需要判断0行0列上有没有马的控制点,控制点后面的值不能赋值1了只能是0; 二是需要判断控制点是否越界,C一越界就各种奇怪问题(真的会很奇怪的) 三是要开longlong 附代码,应该没人写的比我烂了
#include <stdio.h>
//马拦过河卒问题
void bo(long long arr[21][21],int hx,int hy,int x,int y,int z){
if ((0<=hx+x)&&(hx+x<=20)&&(0<=hy+y)&&(hy+y<=20))
{
arr[hx+x][hy+y] = z;
}
}
//一个小函数 判断是否越界加赋值
int main(){
long long arr[21][21] = {0}; //二维数组棋盘20*20,全定义为0
int n,m; //B点坐标
int hx,hy; //马坐标
scanf("%d%d%d%d",&n,&m,&hx,&hy); //输入B坐标与马坐标
bo(arr,hx,hy,1,2,2);
bo(arr,hx,hy,2,1,2);
bo(arr,hx,hy,-1,2,2);
bo(arr,hx,hy,-2,1,2);
bo(arr,hx,hy,1,-2,2);
bo(arr,hx,hy,2,-1,2);
bo(arr,hx,hy,-1,-2,2);
bo(arr,hx,hy,-2,-1,2);
bo(arr,hx,hy,0,0,2);
for (int ix = 0,iy = 0; arr[ix][iy] == 0; ix++) //赋予两端的路径为1种可能(撞到2就不赋值后面的了)
{
arr[ix][iy] = 1;
}
arr[0][0] = 0;
for (int ix = 0,iy = 0; arr[ix][iy] == 0; iy++)
{
arr[ix][iy] = 1;
}
arr[0][0] = 0;
bo(arr,hx,hy,1,2,0);
bo(arr,hx,hy,2,1,0);
bo(arr,hx,hy,-1,2,0);
bo(arr,hx,hy,-2,1,0);
bo(arr,hx,hy,1,-2,0);
bo(arr,hx,hy,2,-1,0);
bo(arr,hx,hy,-1,-2,0);
bo(arr,hx,hy,-2,-1,0);
bo(arr,hx,hy,0,0,0);
for (int ix = 0; ix <= n ; ix++) //遍历x
{
for (int iy = 0; iy <= m; iy++) //遍历y
{
if ((ix!=hx+1||iy!=hy+2)&&
(ix!=hx+2||iy!=hy+1)&&
(ix!=hx+1||iy!=hy-2)&&
(ix!=hx+2||iy!=hy-1)&&
(ix!=hx-1||iy!=hy+2)&&
(ix!=hx-2||iy!=hy+1)&&
(ix!=hx-1||iy!=hy-2)&&
(ix!=hx-2||iy!=hy-1)&&
(ix!=hx||iy!=hy)&&
(ix!=0)&&(iy!=0))
{
arr[ix][iy] = arr[ix-1][iy] + arr[ix][iy-1]; //递推算法
}
}
}
// //DEBUG打印
// for (int iy = 0; iy <= m ; iy++) //遍历x
// {
// for (int ix = 0; ix <= n; ix++) //遍历y
// {
// printf("%lld ",arr[ix][iy]);
// }
// printf("\n");
// }
printf("%lld\n",arr[n][m]); //输出可能的路径数(路径算法)
return 0;
}