poj 2488 -- A Knight's Journey

A Knight's Journey
 
 
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 30388   Accepted: 10404

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


题目大意: 让骑士以字典序遍历整个图,每个点只能到一次。

思路:数据不大,直接搜索即可。注意每个测试数据后面都有一个空行。

 1 /*======================================================================
 2  *           Author :   kevin
 3  *         Filename :   AKnightsJourney.cpp
 4  *       Creat time :   2014-07-31 16:22
 5  *      Description :
 6 ========================================================================*/
 7 #include <iostream>
 8 #include <algorithm>
 9 #include <cstdio>
10 #include <cstring>
11 #include <queue>
12 #include <cmath>
13 #define clr(a,b) memset(a,b,sizeof(a))
14 #define M 30
15 using namespace std;
16 struct Node
17 {
18     int x,y;
19 }steps[M*M];
20 bool vis[M][M];
21 int p,q;
22 int dir[8][2] = {{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
23 int DFS(int x,int y,int cnt)
24 {
25     if(vis[x][y]){
26         return -1;
27     }
28     vis[x][y] = true;
29     steps[cnt].x = x; steps[cnt].y = y;
30     if(cnt == p*q-1) return 1;
31     for(int i = 0; i < 8; i++){
32         int xx = x+dir[i][0];
33         int yy = y+dir[i][1];
34         if(xx >= 1 && xx <= p && yy >= 1 && yy <= q){
35             int ans = DFS(xx,yy,cnt+1);
36             if(ans == 1){
37                 return true;
38             }
39             else if(ans == 0){
40                 vis[xx][yy] = false;
41             }
42         }
43     }
44     return 0;
45 }
46 int main(int argc,char *argv[])
47 {
48     int n,t = 1;
49     scanf("%d",&n);
50     while(n--){
51         clr(steps,0);
52         scanf("%d%d",&p,&q);
53         int cnt = 0;
54         printf("Scenario #%d:
",t++);
55         int flag = 0;
56         for(int i = 1; i <= q; i++){
57             for(int j = 1; j <= p; j++){
58                 clr(vis,0);
59                 if(DFS(j,i,cnt) == 1){  //因为i与j位置反了,贡献了几次wr
60                     flag = 1;
61                     break;
62                 }
63             }
64             if(flag) break;
65         }
66         if(!flag){
67             printf("impossible");
68         }
69         else{
70             for(int i = 0; i < q*p; i++){
71                 printf("%c%d",steps[i].y-1+'A',steps[i].x);
72             }
73         }
74         printf("

");
75     }
76     return 0;
77 }
View Code
原文地址:https://www.cnblogs.com/ubuntu-kevin/p/3885090.html