A Knight's Journey
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 43 Accepted Submission(s) : 15
The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey
around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans?
Problem
Find a path such that the knight visits every square once. The knight can start and end on any square of the board.
If no such path exist, you should output impossible on a single line.
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAX 27
int dir[8][2]= {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}}; //下一步的八個方向
int step,zx[MAX],zy[MAX],map[MAX][MAX],mark;//記錄已經走過的步數,記錄走過的網格的橫縱座標,標記該網格是否走過,記錄是否找到路徑
int p,q;
int dfs(int i,int j)//深搜函數
{
if(mark)return 0;//如果已經找到路徑 返回
int x,y;
zx[step]=i;//記錄當前網格的橫座標
zy[step]=j;//記錄當前網格的縱座標
step++;
if(step==p*q)//如果走過的步數等於棋盤上網格的總數
{
mark=1;//找到路徑
return 0;//返回
}
map[i][j]=1;//標記該網格
for(int k=0; k<8; k++)
{
x=i+dir[k][1];//下一步x
y=j+dir[k][0];//下一步y,這個地方的x,y的順序千萬別錯了,爲了保證字典續
if(map[x][y]==0&&x>0&&x<=p&&y>0&&y<=q)//判斷是否走過 判斷是否越界
{
dfs(x,y);//如果沒有走過,沒有越界,向下深搜
step--;//如果返回 步數減一
}
}
map[i][j]=0;//清除該網格的標記
return 0;
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output1.txt","w",stdout);
int n;
while(cin>>n)
{
for(int i=1; i<=n; i++)
{
cin>>p>>q;
memset(map,0,sizeof(map));//數組清零
step=mark=0;
dfs(1,1);//從(1,1)號網格開始深搜
cout<<"Scenario #"<<i<<":"<<endl;
if(mark)
{
for(int j=0; j<p*q; j++)
printf("%c%d",zy[j]+'A'-1,zx[j]);
cout<<endl;
}
else cout<<"impossible"<<endl;
if(i!=n)cout<<endl;
}
}
return 0;
}