A Knight's JourneyTime Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
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.
Input
Output
If no such path exist, you should output impossible on a single line.
Sample Input
3 1 1 2 3 4 3
Sample Output
Scenario #1: A1 Scenario #2: impossible Scenario #3: A1B3C1A2B4C2A3B1C3A4B2C4
题目大意:通过输入p和q来确定一个p行q列的象棋棋盘,问:马从任意一个位置出发是否能够不重复的走遍所有棋盘上的点,(在象棋中马走日!) 因为是判断是否能够到达所有的点,所以起点是不重要的,我这里把起点设为第一行第一列,因为题目还要求按照字典序输出,所以要考虑每次移动的方向,int fx[]= {-2,-2,-1,-1,1,1,2,2}; int fy[]= {-1,1,-2,2,-2,2,-1,1}; 通过fx【】和fy【】来确定移动位置
上代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int p,q,vis[110][110],path[110][110];
int flag;
int fx[]= {-2,-2,-1,-1,1,1,2,2};
int fy[]= {-1,1,-2,2,-2,2,-1,1};
int check(int x,int y)
{
if(x>0&&x<=q&&y>0&&y<=p&&!vis[x][y]&&!flag)
return 1;
else return 0;
}
void dfs(int x,int y,int step)
{
int i;
path[step][0]=x;
path[step][1]=y;
if(step==p*q)
{
flag=1;
return;
}
for(i=0; i<8; i++)
{
int xx=x+fx[i];
int yy=y+fy[i];
if(check(xx,yy))
{
vis[xx][yy]=1;
dfs(xx,yy,step+1);
vis[xx][yy]=0;
}
}
}
int main()
{
int T,i;
int num=1;
cin>>T;
while(T--)
{
flag=0;
cin>>p>>q;
cout<<"Scenario #"<<num++<<":"<<endl;
memset(vis,0,sizeof(vis));
vis[1][1]=1;
dfs(1,1,1);
if(flag)
{
for(i=1; i<=p*q; i++)
{
printf("%c%d",path[i][0]-1+'A',path[i][1]);
}
cout<<endl;
}
else printf("impossible\n");
cout<<endl;
}
return 0;
}