poj2488

来源:互联网 发布:网络暴力漫画 编辑:程序博客网 时间:2024/06/09 15:25

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

31 12 34 3

Sample Output

Scenario #1:A1Scenario #2:impossibleScenario #3:A1B3C1A2B4C2A3B1C3A4B2C4简单的bfs,对我而言 相对较难 的保存路径与输出路径
#include<cstdio>#include<iostream>#include<cstring>#include<cstring>#define INF 0xfffffff#include<queue>using namespace std;const int Max=30;bool visit[Max][Max],output;//output 判断是否能走遍全部的点int visit_num, p, q;char path[2 * Max];//储存路径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 == visit_num){        for(int i = 0; i < 2 * depth; i ++)            cout << path[i];        cout << endl << endl;        output = true;        return;    }    for(int i = 0; i < 8 && output == false; i ++){       int new_x = x + dx[i];       int new_y = y + dy[i];       if(new_x > 0 && new_y > 0 && new_x <= q && new_y <= p && visit[new_y][new_x] == false){           visit[new_y][new_x] = true;           path[2 * depth ] = 'A' + new_x - 1;//从A开始,我从(1,1)点开始出发,故减一           path[2 * depth + 1] = '1' + new_y - 1;//从1开始           dfs(depth + 1, new_x, new_y);           visit[new_y][new_x] = false;        }    }}int main(){    int n;    cin >> n;    for(int i = 1; i <= n; i ++){        cin >> p >> q;        cout << "Scenario #" << i << ':' << endl;        for(int y = 1; y <= p; y ++)            for(int x = 1; x <= q; x ++)                visit[y][x] = false;        visit_num = p * q;        output = false;        visit[1][1] = true;        path[0] = 'A';        path[1] = '1';        dfs(1,1,1);        if(output == false)            cout << "impossible" << endl << endl;    }    return 0;}



1 0
原创粉丝点击