题意:一个骑士,按照“日”字走法, 问骑士能否在 p*q 的棋盘上,从某个点出发不重复走遍棋盘每个点,如果能,输出骑士每步的位置(按字典序),如果不能,则输出impossible。
题解:设A1为首位置(证明如果能走完的话,必存在一条起点为A1的路径);遍历时先选字典序最小的。
#define INF 0x7fffffff
#define eps (1e-9)
#define clearto(s,x) memset(s,x,sizeof(s))
#define prime 999983
#define maxn 100010
using namespace std;
typedef long long llong;
int n,m,t,tot=0;
int ok,stp;
bool vis[30][30];
int sm[30],sn[30];
int dx[8]={ -2,-2,-1,-1, 1, 1, 2, 2 };
int dy[8]={ -1, 1,-2, 2,-2, 2,-1, 1 };
void dfs(int x,int y){
if(ok) return;
stp++;
sm[stp]=x; sn[stp]=y; vis[x][y]=1;
if(stp==tot) { ok =1; return; }
for(int i=0;i<8;i++){
int nx =x+dx[i];
int ny =y+dy[i];
if( !vis[nx][ny]&&nx>0&&ny>0&&nx<=m&&ny<=n )
{ dfs(nx,ny); stp--; }
}
vis[x][y] =0;
}
int main()
{
//freopen("D:\data.txt","r",stdin);
int TT,tt=1,i,j,k;
scanf("%d",&TT);
while(tt<=TT){
clearto(vis,0);
scanf("%d %d",&n,&m); //数字(1-n), 字母(1-m)
ok =0; stp =0; tot =n*m; dfs(1,1);
printf("Scenario #%d:\n",tt);
if(ok){
for(i=1;i<=tot;i++) printf("%c%d",sm[i]+64,sn[i]); putchar(10);
}
else printf("impossible\n");
if(tt!=TT) printf("\n"); tt++;
}
return 0;
}