您的位置:首页 > 其它

poj 2488 A Knight's Journey 简单dfs回溯 字典序

2014-07-15 18:54 381 查看
http://poj.org/problem?id=2488题目链接

A Knight's Journey

Time Limit: 1000MSMemory Limit: 65536K
Total Submissions: 29706Accepted: 10173
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


题意是一个马在p*q的棋盘内,由一点开始跳,能否跳满整块棋盘 并输出字典序最小的路径

看到需要字典序最小 于是就从1,1开始试了一下结果直接ac了 据说能用反证法证明 如果1,1impossible 则其它一定impossible

需要注意的是dx和dy的顺序

代码如下:

#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
bool map[105][105];
char a[60];
int dx[10]={-1,1,-2,2,-2,2,-1,1};
int dy[10]={-2,-2,-1,-1,1,1,2,2};
int p,q;
int dfs(int x,int y,int step)
{
    if(step==p*q)
        return 1;
    int nx,ny,i;
    map[x][y]=1;
    for(i=0;i<8;i++)
    {
        nx=x+dx[i];
        ny=y+dy[i];
        a[step*2]='A'-1+ny;
        a[step*2+1]='0'+nx;
        if(nx>p||ny>q||nx<1||ny<1||map[nx][ny])
        continue;
        if(dfs(nx,ny,step+1))
            return 1;
        map[nx][ny]=0;
    }
    return 0;
}
int main()
{
    int n,i;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&p,&q);
            memset(map,0,sizeof(map));
            memset(a,0,sizeof(a));
            a[0]='A';
            a[1]='1';
            printf("Scenario #%d:\n",i);
            if(dfs(1,1,1))
                printf("%s\n\n",a);
            else printf("impossible\n\n");
        }
    }
    return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: