#include<stdio.h>
#include<string.h>
int ux[30]/*所走过路数的列坐标*/,uy[30]/*所走过路数的行坐标*/,mark[30][30]/*标记走过的点*/,m/*棋盘行数*/,n/*棋盘列数*/,flag/*控制输出impossible变量*/;
int to[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};//日字格走法的数组
void dfs(int x/*当前列坐标*/,int y/*当前行坐标*/,int step/*走过的步数*/)
{
int nx/*下一步列坐标*/,ny/*下一步行坐标*/,i;
if(step==m*n)//如果所有格子都被遍历过
{
flag=1;
for(i=0;i<step;i++)//输出走过的顺序
{
printf("%c%d",uy[i]+'A',ux[i]+1);
}
printf("\n");
}
for(i=0;i<8;i++)//日字走法八个方向
{
if(flag==1)//因为void函数无返回值,所以所有格子都被遍历过后,break退出函数;
{
break;
}
nx=x+to[i][0];//下一步列坐标变化
ny=y+to[i][1];//下一步行坐标变化
if(nx<0||ny<0||ny>=m||nx>=n||mark[ny][nx]==1)//下一步如果不在棋盘内或者已经走过
{
continue;//不符合,重新走下一个方向
}
else//下一步可以走
{
ux[step]=nx;//将下一步列坐标记录至数组中
uy[step]=ny;//将下一步行坐标记录至数组中
mark[ny][nx]=1;//将下一步标记成走过
dfs(nx,ny,step+1);//进入下一步的格子,继续遍历
mark[ny][nx]=0;//从遍历中退出
}
}
}
int main()
{
int t,i,j,k;
while(scanf("%d",&t)!=EOF)
{
for(i=0;i<t;i++)
{
flag=0;
scanf("%d%d",&n,&m);
printf("Scenario #%d:\n",i+1);
memset(mark,0,sizeof(mark));//标记清零
ux[0]=0;//第一步列坐标0
uy[0]=0;//第一步行坐标0
mark[0][0]=1;//已经站在(0,0)点开始
dfs(0,0,1);//从第一个点开始遍历
if(flag==0)//如果无法走完所有格子
{
printf("impossible\n");
}
puts("");
}
}
return 0;
}
POJ2488 - A Knight's Journey - 深度优先搜索
最新推荐文章于 2023-01-31 11:15:00 发布