X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
坦克车只能水平或垂直方向上移动到相邻的区。
数据格式要求:
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
例如:
用户输入:
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
则程序应该输出:
10
资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗 < 2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
用C数组记录每个位置的最短路径,用dfs逐渐找到B的位置。
1 import java.util.Arrays; 2 import java.util.Scanner; 3 class Main{ 4 static int n; 5 static int[][] a; 6 static int a1; 7 static int a2; 8 static boolean[][] b; 9 static int[][] c; 10 public static void main(String[] args) { 11 Scanner input = new Scanner(System.in); 12 int n = input.nextInt(); 13 a = new int[n+2][n+2]; 14 b = new boolean[n+2][n+2]; 15 c = new int[n+2][n+2]; 16 for(int i=1;i<=n;i++){ 17 for(int j=1;j<=n;j++){ 18 String temp = input.next(); 19 if(temp.charAt(0)=='A'){ 20 a[i][j] = 2; 21 a1 = i; 22 a2 = j; 23 } 24 if(temp.charAt(0)=='+'){ 25 a[i][j] = 1; 26 } 27 if(temp.charAt(0)=='-'){ 28 a[i][j] = -1; 29 } 30 if(temp.charAt(0)=='B'){ 31 a[i][j] = -2; 32 } 33 } 34 } 35 for(int i=0;i<=n;i++){ 36 b[0][i] = true; 37 } 38 for(int i=0;i<=n;i++){ 39 b[n+1][i] = true; 40 } 41 for(int i=0;i<=n;i++){ 42 b[i][0] = true; 43 } 44 for(int i=0;i<=n;i++){ 45 b[i][n+1] = true; 46 } 47 System.out.println(f(a1,a2)); 48 } 49 public static int f(int i,int j){ 50 if(a[i][j]==-2){ 51 return 0; 52 } 53 if(c[i][j]!=0){ 54 return c[i][j]; 55 } 56 b[i][j]= true; 57 System.out.println(i+" "+j); 58 int c1 = Integer.MAX_VALUE-1,c2=c1,c3=c1,c4=c1; 59 if(!b[i][j+1]&&a[i][j]!=a[i][j+1]){ 60 c1 = f(i,j+1); 61 } 62 if(!b[i][j-1]&&a[i][j]!=a[i][j-1]){ 63 c1 = f(i,j-1); 64 } 65 if(!b[i+1][j]&&a[i][j]!=a[i+1][j]){ 66 c2 = f(i+1,j); 67 } 68 if(!b[i-1][j]&&a[i][j]!=a[i-1][j]){ 69 c3 = f(i-1,j); 70 } 71 b[i][j] = false; 72 return c[i][j] = Math.min(Math.min(c1, c2), Math.min(c3, c4))+1; 73 } 74 } 75