骑士的遍历问题
直接上代码
#include<cstdio>
#include<iostream>
#include<cstring>
#define MAXN 100
using namespace std;
int vis[MAXN][MAXN];
int r,c;
int sum;
int answerX[1010];
int answerY[1010];
int dir[8][2]= {{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
int judge(int x,int y)
{
if(x<1||y<1||x>r||y>c)
return 0;
if(vis[x][y])
return 0;
return 1;
}
int dfs(int x,int y,int cnt)
{
answerX[cnt]=x;
answerY[cnt]=y;
int flag=0;
if(cnt==sum)
return 1;
else
{
for(int i=0; i<8; ++i)
{
if(judge(x+dir[i][0],y+dir[i][1]))
{
vis[x+dir[i][0]][y+dir[i][1]]=1;
flag = dfs(x+dir[i][0],y+dir[i][1],cnt+1);
if (flag) return 1;
vis[x+dir[i][0]][y+dir[i][1]]=0;
}
}
}
return flag;
}
int main()
{
int cases;
cin>>cases;
int t=1;
while(t<=cases)
{
cin>>r>>c;
sum=r*c;
cout<<"Scenario #"<<t<<":"<<endl;
++t;
memset(vis,0,sizeof(vis));
memset(answerX,0,sizeof(answerX));
memset(answerY,0,sizeof(answerY));//预处理
//dfs算法
vis[1][1]=1;
int flag=dfs(1,1,1);
if(!flag)
cout<<"impossible"<<endl;
else
{
for(int i=1; i<=sum; ++i)
cout<<(char)((char)(answerY[i])+64)<<answerX[i];
cout<<endl;
}
cout<<endl;
}
}