B

来源:互联网 发布:烟雾视频软件 编辑:程序博客网 时间:2024/04/30 03:14

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


大致题意:给出一个p行q列的国际棋盘,马可以从任意一个格子开始走,问马能否不重复的走完所有的棋盘。如果可以,输出按字典序排列最小的路径。打印路径时,列用大写字母表示(A表示第一列),行用阿拉伯数字表示(从1开始),先输出列,再输出行。

分析:如果马可以不重复的走完所有的棋盘,那么它一定可以走到A1这个格子。所以我们只需从A1这个格子开始搜索,就能保证字典序是小的;除了这个条件,我们还要控制好马每次移动的方向,控制方向时保证字典序最小(即按照下图中格子的序号搜索)。控制好这两个条件,直接从A1开始深搜就行了。

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <map>#include <stack>#include <vector>#include <set>#include <queue>#define maxn 15#define MAXN 100005#define mod 1000000007#define INF 0x3f3f3f3f#define pi acos(-1.0)using namespace std;#define M 30int dx[8]={-1,1,-2,2,-2,2,-1,1};int dy[8]={-2,-2,-1,-1,1,1,2,2}; //8个方向bool map1[M][M]; //表示位置走没走过int cas,f,p,q;struct node  //建立结构体来存储字母和数字{    int s;    char s1;}pp[600];void print()  //单独定义一个输出函数,比较方便{    cout<<"Scenario #"<<cas<<":"<<endl;    for(int i=1;i<=p*q;i++)    cout<<pp[i].s1<<pp[i].s;    cout<<endl;}void go(int x,int y,int step)  //搜索,字母,数字,以及是第几步{    pp[step].s=x;    pp[step].s1='A'+y-1;    if(step==p*q)    {        f=1;        return ;    }    for(int j=0;j<8;j++)    {        if(x+dx[j]>0&&x+dx[j]<=p&&y+dy[j]>0&&y+dy[j]<=q&&map1[x+dx[j]][y+dy[j]]==false&&f==0)        {            map1[x+dx[j]][y+dy[j]]=true;            go(x+dx[j],y+dy[j],step+1);            map1[x+dx[j]][y+dy[j]]=false; //回溯        }     }}int main(){    int t,n;    cin>>t;    cas=0;    n=t;    while(t--)    {        cas++;        cin>>p>>q;        pp[0].s='1'; pp[0].s1='A';        memset(map1,false,sizeof(map1));        f=0;        map1[1][1]=true;        go(1,1,1);        if(f)        print();        else        {            cout<<"Scenario #"<<cas<<":"<<endl;            cout<<"impossible"<<endl;        }        if(cas!=n)        cout<<endl;}}


原创粉丝点击