在一个4X5的棋盘上,马的起始位置坐标(纵、横)位置由键盘输入,求马能返回初始位置的所有不同走法的总数(马走过的位置不能重复,马走“日”字)。
输入
输入文件第一行为测试用例的个数N,接下来N行,每行两个正整数x,y(1<=x<=5,1<=y<=6),表示马的位置坐标.
输出
每个测试用例的输出占一行,输出马能返回初始位置的所有不同走法的总数,如果没有,则输出“ERROR”(不包含双引号)。
样例输入
3
2 2
1 1
4 6
2 2
1 1
4 6
样例输出
4596
1508
ERROR
1508
ERROR
可以用BFS 注意边的取舍就好做了
#include <stdio.h>
#include <string.h>
int map[5][6],sum;
void find(int x,int y,int s,int e)
{
if (x<1 || x>4 || y<1 || y>5) return;
map[x][y]=false;
if (x==s && e==y)
{
sum++;
map[x][y]=true;
if (sum!=0 ) return;
}
if (map[x+2][y+1])find(x+2,y+1,s,e);
if (map[x+2][y-1])find(x+2,y-1,s,e);
if (map[x-2][y+1])find(x-2,y+1,s,e);
if (map[x-2][y-1])find(x-2,y-1,s,e);
if (map[x+1][y+2])find(x+1,y+2,s,e);
if (map[x+1][y-2])find(x+1,y-2,s,e);
if (map[x-1][y-2])find(x-1,y-2,s,e);
if (map[x-1][y+2])find(x-1,y+2,s,e);
map[x][y]=true;
}
int main()
{
int cas,x,y;
scanf("%d",&cas);
while(cas--)
{
scanf("%d %d",&x,&y);
sum=-1;
if(x<1||x>4||y>5||y<1) {printf("ERROR\n");continue;}
memset(map,1,sizeof map);
find(x,y,x,y);
printf("%d\n",sum);
}
return 33;
}