经典的骑士巡游问题,注意字典序最小,应该从上到下,从左到右遍历
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn=30;
int di[]={-1,1,-2,2,-2,2,-1,1},dj[]={-2,-2,-1,-1,1,1,2,2},n,m;
bool vis[maxn][maxn];
vector<char>stak;
bool backtraking(int ci,int cj,int cnt){
vis[ci][cj]=1;
if(cnt==0){
for (int i=0;i<stak.size();++i)
{
printf("%c",stak[i]);
}
printf("\n");
return true;
}
for (int i=0;i<8;++i)
{
int ni=ci+di[i],nj=cj+dj[i];
if(ni>=0&&ni<n&&nj>=0&&nj<m&&!vis[ni][nj]){
stak.push_back('A'+nj),stak.push_back('1'+ni);
if(backtraking(ni,nj,cnt-1))return true;
stak.pop_back(),stak.pop_back();
}
}
vis[ci][cj]=0;
return false;
}
int main(){
int t,cas=1;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
int i,j;
for (int i=0;i<30;++i)
for (int j=0;j<30;++j)vis[i][j]=0;
printf("Scenario #%d:\n",cas++);
stak.clear();
for (i=0;i<m;++i)
{
for (j=0;j<n;++j)
{
stak.push_back('A'+i),stak.push_back('1'+j);
if(backtraking(j,i,n*m-1))break;
stak.pop_back(),stak.pop_back();
}
if(j<n)break;
}
if(i>=m)printf("impossible\n");
printf("\n");
}
return 0;
}