题目链接:http://poj.org/problem?id=2488
通过此题,我学习到:
1.lexicographically 是字典序的,因此按照先字母后数字的原则,八个方向从左到右,从上到下的交替优先顺序,总是从左上角开始就好。
2.此题只要一个方案,因此可以设置flag,在第一次得到结果后(肯定是答案),设置flag,导致以后能够大量剪枝。
3.此题虽然每个格子用字母+数字的形式表示,但是路径可以用全局int[]数组来存储,只要转换过去就好。
4.注意格式,每个答案后多一个回车
java代码:
import java.util.Scanner;
public class Main{
static int[] ipath,jpath;
static boolean flag;
static int n,p,q;
static int[][] direction = { { -1, -2 }, { 1, -2 }, { -2, -1 }, { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 },
{ 1, 2 } };
static boolean[][] cover;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
for(int i=1;i<=n;i++) {
p=scanner.nextInt();
q=scanner.nextInt();
cover=new boolean[p][q];
ipath=new int[p*q];
jpath=new int[p*q];
flag=false;
cover[0][0]=true;
ipath[0]=1;
jpath[0]=1;
dfs(1, 1, 1);
System.out.println("Scenario #"+i+":");
if(flag==true) {
for(int k=0;k<p*q;k++)
System.out.print(""+(char)('A'+jpath[k]-1)+ipath[k]);
System.out.println('\n');
}else {
System.out.println("impossible\n");
}
}
scanner.close();
}
static void dfs(int i,int j,int num) {
if(flag==true)
return;
if(num==p*q) {
flag=true;
return;
}
for(int k=0;k<8;k++) {
int nexti=i+direction[k][0];
int nextj=j+direction[k][1];
if(nexti<1||nexti>p||nextj<1||nextj>q)
continue;
if(flag==false&&cover[nexti-1][nextj-1]==false) {
cover[nexti-1][nextj-1]=true;
ipath[num]=nexti;
jpath[num]=nextj;
dfs(nexti, nextj, num+1);
cover[nexti-1][nextj-1]=false;
}
}
}
}