Description
Background
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
The
input begins with a positive integer n in the first line. The following
lines contain n test cases. Each test case consists of a single line
with two positive integers p and q, such that 1 <= p * q <= 26.
This represents a p * q chessboard, where p describes how many different
square numbers 1, . . . , p exist, q describes how many different
square letters exist. These are the first q letters of the Latin
alphabet: A, . . .
Output
The
output for every scenario begins with a line containing "Scenario #i:",
where i is the number of the scenario starting at 1. Then print a single
line containing the lexicographically first path that visits all
squares of the chessboard with knight moves followed by an empty line.
The path should be given on a single line by concatenating the names of
the visited squares. Each square name consists of a capital letter
followed by a number.
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
Source
TUD Programming Contest 2005, Darmstadt, Germany
要求字典序最小,那么暴力枚举起点然后DFS就行。沿途存下路径,最后转化成字符输出。
1 /**/ 2 #include<iostream> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 #include<algorithm> 7 using namespace std; 8 const int mxn=125; 9 int vis[mxn][mxn]; 10 bool flag; 11 int mx[9]={0,-2,-2,-1,-1,1,1,2,2}, 12 my[9]={0,-1,1,-2,2,-2,2,-1,1}; 13 int n,m; 14 int qx[mxn],qy[mxn]; 15 void dfs(int x,int y,int cnt){ 16 qx[cnt]=x;qy[cnt]=y; 17 vis[x][y]=1; 18 if(cnt==m*n){ 19 flag=1; 20 return; 21 } 22 for(int i=1;i<=8;i++){ 23 int nx=mx[i]+x; 24 int ny=my[i]+y; 25 if(nx<1 || nx>m || ny<1 || ny>n)continue; 26 if(vis[nx][ny])continue; 27 dfs(nx,ny,cnt+1); 28 if(flag)return; 29 } 30 vis[x][y]=0; 31 return; 32 } 33 int main(){ 34 int T; 35 scanf("%d",&T); 36 int cas=0; 37 for(cas=1;cas<=T;cas++){ 38 memset(vis,0,sizeof vis); 39 flag=0; 40 int i,j; 41 scanf("%d%d",&n,&m); 42 for(i=1;i<=m;i++){ 43 if(flag)break; 44 for(j=1;j<=n;j++){ 45 dfs(i,j,1); 46 if(flag)break; 47 } 48 } 49 printf("Scenario #%d:\n",cas); 50 if(flag){ 51 for(i=1;i<=n*m;i++)printf("%c%d",qx[i]+‘A‘-1,qy[i]); 52 } 53 else printf("impossible"); 54 printf("\n"); 55 if(cas<T)printf("\n"); 56 } 57 return 0; 58 }
POJ2488 A Knight's Journey