文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>POJ 2488 A Knight's Journey 解题报告

POJ 2488 A Knight's Journey 解题报告

时间:2010-04-02  来源:MC_ACM

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

 

题目大意:

给出一个棋盘,判断骑士能否不重复的走过所有格,只能按照中国象棋中马的走法

,并记录下其中按字典序排列的第一种路径。

 

 

解题思路:

DFS+回溯,但是要注意方向。另外还要注意下面几点:

(1) 题目要求以"lexicographically"方式输出,也就是字典序,要以字典序输出路径,那么方向数组就要以特殊的顺序排列了...这样只要每次从dfs(1,1)开始搜索,第一个成功遍历的路径一定是以字典序排列...

(2) 横行为字母,表示横行坐标的是y;纵行为数字,表示纵行的坐标是x

代码:

 

#include<stdio.h>
#define MAX 27
int loca[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},
{2,-1},{2,1}};   //规定骑士移动方向,字典排序在此体现

int visite[MAX][MAX]; //是否访问过

int x[MAX],y[MAX];  //记录访问过的位置

int total,p,q,visited;
void dfs(int,int);
int main(void)
{
int n,i,j,s;
scanf("%d",&n);
for(s=1;s<=n;s++)
{
scanf("%d %d",&p,&q);
total=0;
visited=0;
for(i=1;i<=p;i++)
{
for(j=1;j<=q;j++)
{
visite[i][j]=0;
}
}
dfs(1,1);
printf("Scenario #%d:\n",s);
if(visited)
{
for(i=1;i<=p*q;i++)
{
printf("%c%d",y[i]+64,x[i]);  
//注意,先输出字母,在输出数字,容易弄反

}
printf("\n");
}
else
{
printf("impossible\n");
}
printf("\n");
}
return 0;
}
void dfs(int r,int w)
{
int s,t,i;
if(visited)return;
total++;
x[total]=r;
y[total]=w;
if(total==p*q)
{
visited=1;
return;
}
visite[r][w]=1;
for(i=0;i<8;i++)
{
t=w+loca[i][0];//y方向

s=r+loca[i][1]; //x方向

if(visite[s][t]==0&&s>0&&s<=p&&t>0&&t<=q)
{
dfs(s,t);
total--;//回溯

}
}
visite[r][w]=0;//返回时重置未访问标记

return;
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载