注意点:字典序,改改方向数组就可以了,简单的DFS。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 26
int di[8][2]={-1,-2,1,-2,-2,-1,2,-1,-2,1,2,1,-1,2,1,2};
int p,q,g;//g用来标记是否成功。
bool vis[N][N];
int path[N][2];
void DFS(int x,int y,int k)
{
int i,e,a,b;
if(k == p*q)
{
for(i = 0; i < k; ++i)
printf("%c%d",path[i][1]+'A',path[i][0]+1);
g = 1;
}
else
{
for(i = 0; i < 8; ++i)
{
a = x + di[i][0]; b = y + di[i][1];
if(vis[a][b]&&a >= 0&&a < p&&b >= 0&&b < q&&!g)
{
vis[a][b] = false;
path[k][0] = a; path[k][1] = b;
DFS(a,b,k+1);
vis[a][b] = true;
}
}
}
}
int main()
{
int n,i,m;
cin >>n;
for(i = 0; i < n; ++i)
{
memset(vis,true,sizeof(vis));
g = 0;
path[0][0] = 0; path[0][1] = 0;
vis[0][0] = false;
cin >>p >> q;
printf("Scenario #%d:\n",i+1);
DFS(0,0,1);
if(!g)
cout <<"impossible";
cout <<endl<<endl;
}
return 0;
}