java蓝桥杯路径之谜_路径之谜

小明冒充X星球的骑士,进入了一个奇怪的城堡。

城堡里边什么都没有,只有方形石头铺成的地面。

假设城堡地面是 n x n 个方格。【如图1.png】所示。

按习俗,骑士要从西北角走到东南角。

可以横向或纵向移动,但不能斜着走,也不能跳跃。

每走到一个新方格,就要向正北方和正西方各射一箭。

(城堡的西墙和北墙内各有 n 个靶子)

同一个方格只允许经过一次。但不必做完所有的方格。

如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?

有时是可以的,比如图1.png中的例子。

本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一)

输入:

第一行一个整数N(0

第二行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 importjava.util.Arrays;2 importjava.util.Scanner;3

4

5 public classMain {6 static int[] a;7 static int[] b;8 static boolean[][] c;9 static int[] d;10 static intn;11 public static voidmain(String[] args) {12 Scanner input = newScanner(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,inth){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 }

你可能感兴趣的:(java蓝桥杯路径之谜)