您的位置:首页 > 其它

poj 2488( 搜索 )

2012-05-14 19:32 344 查看
A Knight's Journey

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


Source

TUD Programming Contest 2005, Darmstadt, Germany

题目类型:搜索

题目描述:用骑士的走路方式,找到一条路径。这条路径上有棋盘上所有的点而且每个点只经过一次。

题目分析:没翻译好,原来路径需要字典序。调整一下方向数组就ok了。

代码如下:

#include <stdio.h>
#include <string.h>
#define N 26

int row;
int column;
int map

;
int dx[8] = {-1,1,-2,2,-2,2,-1,1};
int dy[8] = {-2,-2,-1,-1,1,1,2,2};
struct Point{
int x;
int y;
} way[N*N];

void init(){
memset(map,0,sizeof(map));
}
void show(){
int i;
for( i = 0; i < row*column; i++) {
printf("%c%d",way[i].y+'A',way[i].x+1);
}
printf("\n");
}
int dfs(int x,int y,int level){
int i,nx,ny;
if( level == row * column) {
show();
return 1;
}
for( i = 0; i < 8; i++){
nx = x + dx[i];
ny = y + dy[i];
if( nx >= 0 && nx < row && ny >=0 && ny < column && map[nx][ny] == 0){
map[nx][ny] = 1;
way[level].x = nx;
way[level].y = ny;
if ( dfs(nx,ny,level+1) ) {
return 1;
}
map[nx][ny] = 0;
}
}
return 0;
}

int main()
{

int t,i,j,flag,c = 0;
scanf("%d",&t);
while(t--){
scanf("%d%d",&row,&column);
init();
printf("Scenario #%d:\n",++c);
flag = 0;
for( i = 0; i < row; i++){
for( j = 0; j < column; j++){

map[i][j] = 1;
way[0].x = i;
way[0].y = j;
if ( dfs(i,j,1) ){
flag = 1;
break;
}
map[i][j] = 0;
}
}
if(flag == 0) {
printf("impossible\n");
}
printf("\n");
}

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