题解 | #A Knight's Journey#(DFS)
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=28;
int p,q;
int trans[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};//八个方向转移
bool visit[maxn][maxn];//访问标记
bool dfs(int x,int y,int step,string s){//坐标、已遍历格子数、路径
if(step==p*q){//遍历完成,输出
cout<<s<<endl<<endl;
return true;
}
for(int i=0;i<8;i++){
int nx=x+trans[i][0];
int ny=y+trans[i][1];
char cx=nx+'0';//字符坐标
char cy=ny+'A'-1;
if(nx<1||ny<1||nx>p||ny>q||visit[nx][ny])continue;//越界或已访问过
visit[nx][ny]=true;
string next(s);
next.insert(next.end(),cy);
next.insert(next.end(),cx);
if(dfs(nx,ny,step+1,next))return true;//递归
visit[nx][ny]=false;//遍历失败,返回上层,取消标记
}
return false;
}
int main(){
int n;
string s;
while(scanf("%d",&n)!=EOF){
int casenum=1;
for(int i=0;i<n;i++){
scanf("%d%d",&p,&q);
memset(visit,false,sizeof(visit));
cout<<"Scenario #"<<casenum++<<":"<<endl;
visit[1][1]=true;
if(dfs(1,1,1,"A1"))continue;
else cout<<"impossible"<<endl<<endl;
}
}
return 0;
}
algorithm 文章被收录于专栏
外源题解补充


