Description
![](http://poj.org/images/2488_1.jpg)
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.
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
code:
#include<stdio.h>
int m = 0, n = 0, ans[30], used[30][30], step = 0, flag = 0; int dir[8][2] = {{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};//按字典顺序从(1,1)开始按照这个路径走 void dfs(int x, int y) { int i = 0, fx = 0, fy = 0; if(flag) return; if(step == m*n) { flag = 1; return ; } else { for(i = 0; i<8; i++) { fx = x+dir[i][0]; fy = y+dir[i][1]; if(!used[fx][fy] && fx>0 && fx<=m && fy>0 && fy<=n && !flag) { used[fx][fy] = 1; ans[step++] = fx*99+fy; dfs(fx, fy); step--; used[fx][fy] = 0; } } } } int main() { int i = 1, j = 0, t = 0, count = 0; scanf("%d",&t); while(t--) { scanf("%d %d",&m,&n); for(i = 0; i<m; i++) for(j = 0; j<n; j++) used[i][j] = 0; printf("Scenario #%d:\n",++count); used[1][1] = 1; step = 0; ans[step++] = 1*99+1;//存储x,y轴; flag = 0; dfs(1,1); if(flag) { for(i = 0; i<m*n; i++) printf("%c%d",ans[i]%99+'A'-1,ans[i]/99); printf("\n"); } else { printf("impossible\n"); } if(t!=0) printf("\n"); } return 0; }
或
#include <stdio.h> int step = 0, count = 0, sign = 0; int p = 0, q = 0; int move[26][26]; int dir[8][2] = {{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2},{1, -2}, {1, 2}, {2, -1}, {2, 1}}; typedef struct { int x,y; }node; node seq[30]; void dfs(int i, int j); int main() { int i = 0, j = 0, n = 0, count = 1; scanf("%d",&n); while(n--) { step = 0; sign = 0; scanf("%d %d",&q,&p); for(i = 0; i<=p; i++) for(j = 0; j<=q; j++) move[i][j] = 0; dfs(1,1); if(sign) { printf("Scenario #%d:\n",count++); for(i = 0; i<p*q; i++) printf("%c%d",seq[i].y+64, seq[i].x); printf("\n"); } else { printf("Scenario #%d:\n",count++); printf("impossible\n"); } if(n!=0) printf("\n"); } return 0; } void dfs(int i, int j) { int x = 0, y = 0, k = 0; if(sign) return ; seq[step].x = i; seq[step++].y = j; if(step == p*q) { sign = 1; return ; } move[i][j] = 1; for(k = 0; k<8; k++) { x = i+dir[k][1]; y = j+dir[k][0]; if(move[x][y] == 0 && x>0 && x<=q && y>0 && y<=p) { dfs(x,y); step--; } } move[i][j] = 0; }