http://bailian.openjudge.cn/practice/2488/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int T,n,m,vis[30][30],path[30][2];
int b[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
int flag;
void dfs(int x,int y,int step)
{
vis[x][y]=1;
path[step][0]=x;
path[step][1]=y;
if(step==n*m)
{
flag=1;
return;
}
for(int i=0;i<8;i++)
{
int r=x+b[i][0],c=y+b[i][1];
if(r<1||r>n||c<1||c>m)
continue;
if(vis[r][c]==0&&flag==0)
{
dfs(r,c,step+1);
vis[r][c]=0;//一个案例有几条路径尝试
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> T;
for(int k=1;k<=T;k++)
{
flag=0;
cin >> n >> m;
printf("Scenario #%d:\n",k);
dfs(1,1,1);
if(flag)
{
for(int i=1;i<=n*m;i++)
{
printf("%c%d",path[i][1]-1+'A',path[i][0]);
}
printf("\n");
}
else
printf("impossible\n");
printf("\n");
}
return 0;
}