A Knight's Journey (DFS)
#include<bits/stdc++.h>
using namespace std;
const int Max=30;
int p,q;
int derection[8][2]= {{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
bool visit[Max][Max];
bool DFS(int x,int y,int step,string str) {
if(step==p*q) {
cout<<str<<endl<<endl;
return 1;
}
for(int i=0; i<8; i++) { //zhang tai zhuan yi
int nextx=x+derection[i][0];
int nexty=y+derection[i][1];
if(nextx<0||nextx>=p||nexty<0||nexty>=q||visit[nextx][nexty]) {
continue;
}
char row=nextx+'1';
char col=nexty+'A';
visit[nextx][nexty]=1;
if(DFS(nextx,nexty,step+1,str+col+row)) { //递归,从这一格继续向下一格前进。
return 1;
}
visit[nextx][nexty]=0; //取消标记。 极为重要,回溯的思想,搜索失败的时候,当前位置访问的标记要变会false;
}
return 0; //八个方向的走法都不行,则本次递归失败,回到上一次递归层。
}
int main() {
int caseN;
cin>>caseN;
int n=0;
while(caseN--) {
while(cin>>p>>q) {
memset(visit,0,sizeof(visit));
cout<<"Scenario #"<<++n<<":"<<endl;
visit[0][0]=1;
if(!DFS(0,0,1,"A1")) { //初始状态
cout<<"impossible"<<endl<<endl;
}
}
}
return 0;
}
using namespace std;
const int Max=30;
int p,q;
int derection[8][2]= {{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
bool visit[Max][Max];
bool DFS(int x,int y,int step,string str) {
if(step==p*q) {
cout<<str<<endl<<endl;
return 1;
}
for(int i=0; i<8; i++) { //zhang tai zhuan yi
int nextx=x+derection[i][0];
int nexty=y+derection[i][1];
if(nextx<0||nextx>=p||nexty<0||nexty>=q||visit[nextx][nexty]) {
continue;
}
char row=nextx+'1';
char col=nexty+'A';
visit[nextx][nexty]=1;
if(DFS(nextx,nexty,step+1,str+col+row)) { //递归,从这一格继续向下一格前进。
return 1;
}
visit[nextx][nexty]=0; //取消标记。 极为重要,回溯的思想,搜索失败的时候,当前位置访问的标记要变会false;
}
return 0; //八个方向的走法都不行,则本次递归失败,回到上一次递归层。
}
int main() {
int caseN;
cin>>caseN;
int n=0;
while(caseN--) {
while(cin>>p>>q) {
memset(visit,0,sizeof(visit));
cout<<"Scenario #"<<++n<<":"<<endl;
visit[0][0]=1;
if(!DFS(0,0,1,"A1")) { //初始状态
cout<<"impossible"<<endl<<endl;
}
}
}
return 0;
}