按国际象棋上的马走,从A1开始,记录访问全部点的字典序
dfs
#include <cstdio>
#include <cstring>
using namespace std;
int p,q,sum;
char path[70];
bool flag,visi[35][35];
int dx[8]={-1,1,-2,2,-2,2,-1,1};
int dy[8]={-2,-2,-1,-1,1,1,2,2};
void dfs(int dep,int x,int y)
{
int i,j;
if(dep==sum)
{
for(i=0;i<2*dep;i++)
{
printf("%c",path[i]);
}
printf("\n");
flag=true;
}
else
{
for(i=0;i<8&&flag==false;i++)
{
int x1=x+dx[i];
int y1=y+dy[i];
if(x1>0&&y1>0&&x1<=p&&y1<=q&&!visi[x1][y1])
{
visi[x1][y1]=true;
path[2*dep]='A'+y1-1;
path[2*dep+1]='0'+x1;
dfs(dep+1,x1,y1);
visi[x1][y1]=false;
}
}
}
}
int main()
{
int n,i,j;
//freopen("1.txt","r",stdin);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&p,&q);
sum=p*q;
flag=false;
printf("Scenario #%d:\n",i);
path[0]='A';
path[1]='1';
visi[1][1]=true;
dfs(1,1,1);
if(!flag)
printf("impossible\n");
if(i!=n)
printf("\n");
}
}