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

题意:以国际象棋中的马的行棋规则,不重复遍历一个n*m的棋盘,以输出字典序最小的遍历路径。

分析:这题首先要清楚国际象棋中的马的行棋规则,每步棋先横走或直走一格,然后再斜走一格,可以越子,也没有“中国象棋”中“蹩马腿”的限制。我就在这里废了不少时间,之前对国际象棋不太了解,虽说题目中有提到,但是那句英语我还是没看懂。回到正题,既然要遍历整个棋盘,那就干脆用回溯法吧。这里要注意的就是那个字典序了,在选择回溯的下一步时要先列后行,这样从A1开始遍历第一次找到的结果就是字典序最小的了。

import java.util.Scanner;

public class Main {

	static int N, M;
static int[][] path;
static boolean flag; static boolean isKnightMove(int a, int b, int i, int j) { if (((a - 2 == i || a + 2 == i) && ( b ==j-1 || b==j+1))
|| ((b - 2 == j || b + 2 == j)&& (a -1==i||a+1==i))) {
return true;
}
return false;
} static void DFS(int n, int nextI, int nextJ, String str) { if (n == N * M) {
flag=true;
System.out.println(str);
} if(!flag){
//先行后列
for (int j = 1; j <= M; j++) {
for (int i = 1; i <= N; i++) {
if (isKnightMove(nextI, nextJ, i, j) && path[i][j] == 0) {
path[i][j] = 1;
char c = (char) (j + 64);
DFS(n + 1, i, j, str + c + "" + i);
path[i][j] = 0;
}
}
}
}
} public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cases=sc.nextInt();
for(int i=1;i<= cases;i++){
N = sc.nextInt();
M = sc.nextInt();
flag=false;
path = new int[30][30];
//从A1开始遍历
path[1][1]=1;
System.out.println("Scenario #"+i+":");
DFS(1, 1,1,"A1");
if(!flag){
System.out.println("impossible");
}
System.out.println();
} }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Poj 2488 A Knight's Journey(搜索)的更多相关文章

  1. POJ 2488 -- A Knight's Journey(骑士游历)

    POJ 2488 -- A Knight's Journey(骑士游历) 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. 经典的“骑士游历”问题 ...

  2. POJ 2488 A Knight's Journey(深搜+回溯)

    A Knight's Journey Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) ...

  3. POJ 2488 A Knight's Journey(DFS)

    A Knight's Journey Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 34633Accepted: 11815 De ...

  4. 搜索 || DFS || POJ 2488 A Knight's Journey

    给一个矩形棋盘,每次走日字,问能否不重复的走完棋盘的每个点,并将路径按字典序输出 *解法:按字典序输出路径,因此方向向量的数组按字典序写顺序,dfs+回溯,注意flag退出递归的判断,并且用pre记录 ...

  5. POJ 2488 A Knight's Journey (回溯法 | DFS)

    题目链接:http://poj.org/problem?id=2488 题意: 在国际象棋的题盘上有一个骑士,骑士只能走“日”,即站在某一个位置,它可以往周围八个满足条件的格子上跳跃,现在给你一个p ...

  6. poj 2488 A Knight's Journey 【骑士周游 dfs + 记忆路径】

    题目地址:http://poj.org/problem?id=2488 Sample Input 3 1 1 2 3 4 3 Sample Output Scenario #1: A1 Scenari ...

  7. [poj]2488 A Knight's Journey dfs+路径打印

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45941   Accepted: 15637 Description Bac ...

  8. poj 2488 A Knight's Journey( dfs )

    题目:http://poj.org/problem?id=2488 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. #include <io ...

  9. POJ 2488 A Knight's Journey【DFS】

    补个很久之前的题解.... 题目链接: http://poj.org/problem?id=2488 题意: 马走"日"字,让你为他设计一条道路,走遍所有格,并输出字典序最小的一条 ...

随机推荐

  1. 常用模块---sys&logging&序列化模块(json&pickle)

    sys 模块 sys.argv 命令行参数List,第一个元素是程序本身路径,通常用来避免io 阻塞 print('欢迎进入') info=sys.argv ': print('login succe ...

  2. CMD 删除脚本

    CMD 删除脚本 forfiles /p D:\BACKUP\WindowsImageBackup /s /m *.* /d -14 /c "cmd /c del @file"; ...

  3. PHP中的常见魔术方法功能作用及用法实例

    概述 在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发. 开始之前 在总结 ...

  4. php数组函数-array_flip()

    array_flip()函数返回一个反转后的数组,如果同一个值出现多次,则最 后一个键名作为它的值,所有其他的键名将丢失. 如果原数组中的值得数据类型不是字符串或整数,函数将报错. array_fli ...

  5. C++字符串操作库函数

    #include <bits/stdc++.h> using namespace std; int main() { ]="; ]="abcdefg"; ]= ...

  6. yum 源配置

    在 /etc/yum.repos.d 下建立一个 .repo 文件 vim  yum.repo [cd] name=cd baseurl=file:///run/media/root/RHEL-7.0 ...

  7. Oracle 数据库 INTERVAL DAY TO SECOND类型的使用

    INTERVAL DAY TO SECOND类型可以用来存储单位为天和秒的时间间隔.下面这条语句创建一个名为promotions的表,用来存储促销信息.promotions表包含了一个INTERVAL ...

  8. Delphi 的 Utf-8 转换

    新版的 Delphi 應該不用這麼麻煩, 據說只要直接在 AnsiString, WideString, UTF8String 之間 assign 時就會自動幫你做轉換 (沒用過, 不知道是不是真的這 ...

  9. Spring Boot入门(二)

    一.Spring Boot项目打包 1.引入maven打包相关插件 2.项目右击run as>Maven clean.run as>Maven install在target文件夹下会生成相 ...

  10. mysql: 模糊查询 feild like keyword or feild like keyword , concat(feild1,feild2,feild3) like keyword

    mysql: 模糊查询 feild like '%keyword%' or feild like'% keyword%' , 或者 concat(feild1,feild2,feild3) like ...