题意:就是棋盘中的🐎遍历所有的位置,输出最小的字典序。
方向偏移量按题目中设置 int xx[8][2]= {{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#define x first
#define y second
using namespace std;
typedef long long ll;
const int N=100010;
int n,m;
//int xx[8][2]= {{2,1},{1,2},{-1,2},{-2,1},{-1,-2},{-2,-1},{1,-2},{2,-1}};
int xx[8][2]= {{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
set<string>s;
char aa[]=" ABCDEFGHIJKLMNOPQRSTUVWSYZ";
int a[50][50];
int book[50][50];
int path[50][50];
int f;
void bfs(int x,int y,int s) {
int xt,yt;
path[s][0]=y;
path[s][1]=x;
if(s==n*m) {
f=1;
for(int i=1; i<=n*m; i++) {
printf("%C%d",aa[path[i][0]],path[i][1]);
}
puts("");
return ;
}
for(int i=0; i<8; i++) {
xt=x+xx[i][0];
yt=y+xx[i][1];
if(xt<1||yt<1||xt>n||yt>m)continue;
if(book[xt][yt]==1)continue;
if(f)break;
book[xt][yt]=1;
bfs(xt,yt,s+1);
book[xt][yt]=0;
}
}
int main() {
int t;
cin>>t;
int k=1;
while(t--) {
f=0;
memset(book,0,sizeof book);
cin>>n>>m;
book[1][1]=1;
printf("Scenario #%d:\n",k++);
bfs(1,1,1);
if(!f)printf("impossible\n");
printf("\n");
}
}