首页 > 代码库 > 路径之谜
路径之谜
小明冒充X星球的骑士,进入了一个奇怪的城堡。
城堡里边什么都没有,只有方形石头铺成的地面。
假设城堡地面是 n x n 个方格。【如图1.png】所示。
按习俗,骑士要从西北角走到东南角。
可以横向或纵向移动,但不能斜着走,也不能跳跃。
每走到一个新方格,就要向正北方和正西方各射一箭。
(城堡的西墙和北墙内各有 n 个靶子)
同一个方格只允许经过一次。但不必做完所有的方格。
如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?
有时是可以的,比如图1.png中的例子。
本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一)
输入:
第一行一个整数N(0<N<20),表示地面有 N x N 个方格
第二行N个整数,空格分开,表示北边的箭靶上的数字(自西向东)
第三行N个整数,空格分开,表示西边的箭靶上的数字(自北向南)
输出:
一行若干个整数,表示骑士路径。
为了方便表示,我们约定每个小格子用一个数字代表,从西北角开始编号: 0,1,2,3....
比如,图1.png中的方块编号为:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
示例:
用户输入:
4
2 4 3 4
4 3 3 3
程序应该输出:
0 4 5 1 2 3 7 11 10 9 13 14 15
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
dfs题
a:自西向东靶子上箭的数目。
b:自南向北靶子上箭的数目。
c:记录有没有走过第i,j个格子。
d:记录走过的路线。
a1:当前自西向东靶子上箭的数目。
b1:当前自南向北靶子上箭的数目。
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 5 public class Main { 6 static int[] a; 7 static int[] b; 8 static boolean[][] c; 9 static int[] d; 10 static int n; 11 public static void main(String[] args) { 12 Scanner input = new Scanner(System.in); 13 n = input.nextInt(); 14 a = new int[n+1]; 15 b = new int[n+1]; 16 c = new boolean [n+2][n+2]; 17 d = new int[n*n+1]; 18 c[1][1] = true; 19 for(int i=0;i<=n;i++){ 20 c[0][i] = true; 21 } 22 for(int i=0;i<=n;i++){ 23 c[n+1][i] = true; 24 } 25 for(int i=0;i<=n;i++){ 26 c[i][0] = true; 27 } 28 for(int i=0;i<=n;i++){ 29 c[i][n+1] = true; 30 } 31 for(int i=1;i<=n;i++){ 32 a[i] = input.nextInt(); 33 } 34 for(int i=1;i<=n;i++){ 35 b[i] = input.nextInt(); 36 } 37 a[1]--; 38 b[1]--; 39 f(a,b,1,1,1); 40 41 } 42 public static void f(int[] a1,int[] b1,int i,int j,int h){ 43 if(f1(a1,b1)){ 44 return; 45 } 46 if(f2(a1,b1)&&i==n&&j==n){ 47 d[h] = n*n-1; 48 for(int k=1;k<=h;k++){ 49 System.out.print(d[k]+" "); 50 } 51 System.exit(0); 52 } 53 if(i==n&&j==n){ 54 return; 55 } 56 d[h] = (i-1)*n+j-1; 57 if(!c[i-1][j]){ 58 c[i-1][j] = true; 59 a1[j]--; 60 b1[i-1]--; 61 f(a1,b1,i-1,j,h+1); 62 c[i-1][j] = false; 63 a1[j]++; 64 b1[i-1]++; 65 } 66 if(!c[i+1][j]){ 67 c[i+1][j] = true; 68 a1[j]--; 69 b1[i+1]--; 70 f(a1,b1,i+1,j,h+1); 71 c[i+1][j] = false; 72 a1[j]++; 73 b1[i+1]++; 74 } 75 if(!c[i][j-1]){ 76 c[i][j-1] = true; 77 a1[j-1]--; 78 b1[i]--; 79 f(a1,b1,i,j-1,h+1); 80 c[i][j-1] = false; 81 a1[j-1]++; 82 b1[i]++; 83 } 84 if(!c[i][j+1]){ 85 c[i][j+1] = true; 86 a1[j+1]--; 87 b1[i]--; 88 f(a1,b1,i,j+1,h+1); 89 c[i][j+1] = false; 90 a1[j+1]++; 91 b1[i]++; 92 } 93 } 94 public static boolean f1(int[] a1,int[] b1){ 95 for(int i=1;i<=n;i++){ 96 if(a1[i]<0||b1[i]<0){ 97 return true; 98 } 99 } 100 return false; 101 } 102 public static boolean f2(int[] a1,int[]b1){ 103 for(int i=1;i<=n;i++){ 104 if(a1[i]!=0||b1[i]!=0){ 105 return false; 106 } 107 } 108 return true; 109 } 110 111 112 }
路径之谜