题意:给出一个国际棋盘的大小,判断马能否不重复走过所有格,并记录下其中按字典序排列的第一种路径。
既然是按字典序排列,那么从A1出发一定能到达所有点,以A1为起点开始遍历。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int sx[26],sy[26];//存储遍历路径
int p, q, flag, fx, fy, z;
int use[30][30];
int xm[8]={-2,-2,-1,-1,1,1,2,2};
int ym[8]={-1,1,-2,2,-2,2,-1,1};
//注意这里的初始化方法是按照从上至下,从左至右的方式初始化的,这样遍历的方式就会直接是字典序方式
void dfs(int x, int y)
{
int tx, ty;
if(fx==p*q)//如果遍历到所有点则返回
{
flag=1;return;
}
for(int i=0;i<8;i++)
{
tx=xm[i]+x;
ty=ym[i]+y;
if(tx<0||ty<0||tx>=q||ty>=p||use[tx][ty])
continue; //判断下一个点是否符合条件
use[tx][ty]=1;
sx[fx++]=tx;sy[fy++]=ty;//将此点加入路径
dfs(tx,ty);
if(flag) return;//找到符合条件的路径则返回退出
else
{
fx--;fy--;use[tx][ty]=0;
//否则将此点从路径中删除,继续寻找下一个符合条件的点
}
}
}
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
for(int i=1;i<=t;i++)
{
scanf("%d%d",&p,&q);
flag=0;fx=fy=0;
memset(use,0,sizeof(use));
//初始化第一步,将A1存入路径
use[0][0]=1;
sx[fx++]=0;sy[fy++]=0;
dfs(0,0);
printf("Scenario #%d:\n",i);
if(!flag) printf("impossible\n");
else
{
for(int j=0;j<fx;j++)
printf("%c%d",'A'+sx[j],1+sy[j]);
printf("\n");
}
if(i!=t) printf("\n");
}
}
return 0;
}