题目 1825: 蓝桥杯-穿越雷区

题目描述:

X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?

已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -

坦克车只能水平或垂直方向上移动到相邻的区。

代码:

package lanqiao;

import java.util.*;

public class Main {
    public static char[][] map = new char[101][101];
    public static int[][] vis = new int[101][101];
    public static int n,Ax,Ay;
    public static int cnt = 10001;
    public static void dfs(int x,int y,int num)
    {
        if(num >= cnt){
            return;
        }
        if(map[x][y] == 'B')
        {
            cnt = num;
            return;
        }
        vis[x][y] = 1;
        if(x-1>=1&&vis[x-1][y]!=1&&map[x][y]!=map[x-1][y]){
            dfs(x-1,y,num+1);
        }
        if(x+1>=1&&vis[x+1][y]!=1&&map[x][y]!=map[x+1][y]){
            dfs(x+1,y,num+1);
        }
        if(y-1>=1&&vis[x][y-1]!=1&&map[x][y]!=map[x][y-1]){
            dfs(x,y-1,num+1);
        }
        if(y+1>=1&&vis[x][y+1]!=1&&map[x][y]!=map[x][y+1]){
            dfs(x,y+1,num+1);
        }
        vis[x][y] = 0;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        for(int i = 1;i <= n;i ++)
        {
            for(int j = 1;j <= n;j ++)
            {
                map[i][j] = sc.next().charAt(0);
                if(map[i][j] == 'A'){
                    Ax = i;
                    Ay = j;
                }
            }
        }
        dfs(Ax,Ay,0);
        if(cnt == 10001)
        {
            System.out.println(-1);
        }else{
            System.out.println(cnt);
        }
    }
}

你可能感兴趣的:(蓝桥杯,深度优先,算法)