按象棋中的马的走法来走迷宫,要求覆盖完所有点,完全dfs不过注意保存路径,还有dfs的字典序方向。
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<cstring>
using namespace std;
stack<int>s;
int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};//八个方向,但要注意字典序,所以方向的陈列是有顺序的
int t,p,q,matrix[8][8];
bool flag=false;//作为找到答案的标志
bool check(){//检查
for(int i=1; i<=q; i++)
for(int j=1; j<=p; j++)if(!matrix[i][j])return false;
return true;
}
void dfs(int x,int y){//dfs走迷宫
if(flag)return;//因为是按照字典序进行查找的,一旦找到即为答案不用再找了
bool tmp=false;//判断是否走投无路的标志
matrix[x][y]=1;
for(int i=0; i<8; i++){
int a=x+dir[i][0];
int b=y+dir[i][1];
if(a>=1&&a<=q&&b>=1&&b<=p&&matrix[a][b]==0)
{
dfs(a,b);
matrix[a][b]=0;//注意回溯过程的还原
tmp=true;
}
}
if(!tmp&&check())flag=true;//走投无路的时候才进行检查
if(flag){ s.push(y); s.push(x); }//用栈来保存路径
}
int main(){
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%d %d",&p,&q);
memset(matrix,0,sizeof(matrix));
flag=false;
dfs(1,1);
printf("Scenario #%d:\n",i);
if(flag){
while(!s.empty()){
char r=s.top()-1+'A';
s.pop();
printf("%c%d",r,s.top());
s.pop();
}
printf("\n");
}
else
printf("impossible\n");
if(i!=t)printf("\n"); //坑爹的格式注意一下
}
return 0;
}