POJ 2488

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

Description

POJ 2488_第1张图片 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,考虑棋子好移动的位置。
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <map>
#include <string>
#include <stack>
#include <cctype>
#include <vector>
#include <queue>
#include <set>


using namespace std;
//#define Online_Judge
#define outstars cout << "***********************" << endl;
#define clr(a,b) memset(a,b,sizeof(a))
#define lson l , mid  , rt << 1
#define rson mid + 1 , r , rt << 1|1
#define FOR(i , x , n) for(int i = (x) ; i < (n) ; i++)
#define FORR(i , x , n) for(int i = (x) ; i <= (n) ; i++)
#define REP(i , x , n) for(int i = (x) ; i > (n) ; i--)
#define REPP(i ,x , n) for(int i = (x) ; i >= (n) ; i--)
#define mid ((l + r) >> 1)
#define mk make_pair
const int MAXN = 25;
const int maxw = 10000000 + 20;
const int MAXNNODE = 10000 +10;
const long long LLMAX = 0x7fffffffffffffffLL;
const long long LLMIN = 0x8000000000000000LL;
const int INF = 0x7fffffff;
const int IMIN = 0x80000000;
#define eps 1e-8
#define mod 10007
typedef long long LL;
const double PI = acos(-1.0);
typedef double D;
typedef pair<int , int> pii;
int vis[MAXN][MAXN] , ok;
int num , p , q;
char path[MAXN *2];
int dx[8] = {-2 , -2 , -1 , -1 , 1 , 1 , 2 , 2};
int dy[8] = {-1 , 1 , -2 , 2 , -2 , 2 , -1 , 1};
void dfs(int depth , int x ,int y)
{
    if(depth == num)
    {
        FOR(i , 0 , 2 * depth)
        {
            printf("%c" , path[i]);
        }
        printf("\n");
        ok  = 1;
        return ;
    }
    for(int i = 0 ; i < 8 && !ok  ; i++)
    {
        int xx = x + dx[i];
        int yy = y + dy[i];
        if(xx > 0 && yy >0 && xx <= q&& yy <= p&&!vis[yy][xx])
        {
            vis[yy][xx] = 1;
            path[2 * depth] = 'A' + xx - 1;
            path[2 * depth + 1] = '1' + yy - 1;
            dfs(depth + 1 , xx , yy);
            vis[yy][xx] = 0;
        }
    }
}
int main()
{
    //ios::sync_with_stdio(false);
#ifdef Online_Judge
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
#endif // Online_Judge
    int n;
    cin >> n;
    FORR(i , 1 , n)
    {
        scanf("%d%d" , &p , &q);
        printf("Scenario #%d:\n" , i);
        clr(vis , 0);
        num = p * q;
        ok = 0;
        vis[1][1] = 1;
        path[0] = 'A' , path[1] = '1';
        dfs(1 , 1 , 1);
        if(!ok)printf("impossible\n");
        printf("\n");
    }
    return 0;
}



你可能感兴趣的:(ACM,DFS)