zoukankan      html  css  js  c++  java
  • 标题:穿越雷区

    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     
  • 相关阅读:
    旧的非flash版Metalink的入口
    了解rman catalog的兼容性
    Identify ksusetxn DID:An Deadlock ID
    [zt]如何有效地报告Bug
    深入了解ASMM
    解决sqlplus的segmentation fault或hang问题
    [zt]提问的艺术
    oracle 好书 05 ( 内存组件与 oracle 进程 )
    oracle 好书 03 ( 数据字典 )
    Oracle 好书 02 ( 安装oracle 10g软件及创建数据库 )
  • 原文地址:https://www.cnblogs.com/lolybj/p/6870290.html
Copyright © 2011-2022 走看看