首页 > 代码库 > poj2488 bfs

poj2488 bfs

http://poj.org/problem?id=2488

A Knight‘s Journey

Time Limit: 1000MS

 

Memory Limit: 65536K

Total Submissions: 41951

 

Accepted: 14274

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

技术分享
 
记录路径。
 
AC代码:
#include<cstdio>#include<cstring>using namespace std;int T,p,q;int To[8][2]= {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};int trp[900][2],visit[30][30];int dfs(int ed,int be,int x,int y){    if(be==ed)return 1;    for(int i=0; i<8; i++)    {        int xx=x+To[i][0];        int yy=y+To[i][1];        if(xx>=0 && xx<q && yy>=0 && yy<p && !visit[xx][yy])        {            visit[xx][yy]=1;            if(dfs(ed,be+1,xx,yy))            {                trp[be][0]=xx;                trp[be][1]=yy;                return 1;            }            visit[xx][yy]=0;        }    }    return 0;}int main(){    int k=0;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&p,&q);        memset(visit,0,sizeof(visit));        trp[0][0]=0;        trp[0][1]=0;        visit[0][0]=1;        printf("Scenario #%d:\n",++k);        if(dfs(p*q,1,0,0))        {            for(int i=0; i<p*q; i++)                printf("%c%d",trp[i][0]+A,trp[i][1]+1);        }        else            printf("impossible");        printf("\n");        if(T!=0)printf("\n");    }    return 0;}

 

 

poj2488 bfs