搜索的一道水题,难点在于搜索到顺序,只有按照特定的顺序才能得出lexicographically first path,即只有先搜索最前一列的最上面,接着再搜索最前一列的最下方,然后搜索紧邻第一列的最上面,最下面,后面依次类推,只有按照这样的顺序才可以得出题目要求的lexicographically first path。采用深搜,还要注意回溯和返回条件,这里将dfs的返回类型设置为bool类型,是为了按照上述顺序搜索路径,只要存在就立即结束搜索,而搜索结果就是题目要求的lexicographically first path。最后还要注意的一点就是一定要从(1,1)这个点开始搜索,否则也得不出正确结果(注意:无论从哪一个点开始搜索,若可以找到一条路径,则说明从任意一点开始都可以找到一条路径,否则无论从哪一点开始搜索都找不到路径,因为对于每一个点搜索的8个位置都已经确定了,那么就可以从(1,1)这点开始,这样既可以判断是否存在一条路径,若存在,则可以求出满足题目要求的lexicographically first path。)下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define Max 30
pair<int,int> record[Max];
bool flag[Max][Max];
int Case;
int p,q;
int dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
bool dfs(int x,int y,int index){
if(index==p*q)
return 1;
for(int i=0;i<8;i++){
int tempx=x+dir[i][0];
int tempy=y+dir[i][1];
if(tempx>=1 && tempx<=p && tempy>=1 && tempy<=q && !flag[tempx][tempy]){
record[index].first=tempx;
record[index].second=tempy;
flag[tempx][tempy]=1;
if(dfs(tempx,tempy,index+1))
return 1;
flag[tempx][tempy]=0;
}
}
return 0;
}
int main(){
scanf("%d",&Case);
int time=1;
while(Case--){
scanf("%d%d",&p,&q);
memset(flag,0,sizeof(flag));
record[0].first=1;
record[0].second=1;
flag[1][1]=1;
printf("Scenario #%d:\n",time++);
if(dfs(1,1,1))
for(int i=0;i<p*q;i++)
printf("%c%d",record[i].second+'A'-1,record[i].first);
else
printf("impossible");
printf("\n\n");
}
return 0;
}