蓝桥杯 - 穿越雷区

解题思路:

dfs

方法一:

import java.util.Scanner;

public class Main {
    static char[][] a;
    static int[][] visited;
    static int[] dx = { 0, 1, 0, -1 };
    static int[] dy = { 1, 0, -1, 0 };
    static long min = Long.MAX_VALUE;
    static long count = 0;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        a = new char[n][n];
        visited = new int[n][n];
        String str[] = new String[n];
        int startx = 0;
        int starty = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                a[i][j] = in.next().charAt(0);
                if (a[i][j] == 'A') {
                    startx = i;
                    starty = j;
                }
            }
        }
        dfs(startx, starty, n);
        if(min == Integer.MAX_VALUE) min = -1;
        System.out.println(min);

    }

    public static void dfs(int x, int y, int n) {
        visited[x][y] = 1;
        if (a[x][y] == 'B') {
            min = Math.min(min, count);
            return;
        }
        for (int i = 0; i < 4; i++) {
            int xx = x + dx[i];
            int yy = y + dy[i];
            if (xx >= 0 && xx < n && yy >= 0 && yy < n && a[xx][yy] != a[x][y] && visited[xx][yy] == 0) {
                count++;
                dfs(xx, yy, n);
                visited[xx][yy] = 0;
                count--;
            }
        }

    }

}

方法二:

时间复杂度更低,不易超时

import java.util.Scanner;

public class Main {
    static char[][] a;
    static int[][] visited;
    static int[] dx = { 0, 1, 0, -1 };
    static int[] dy = { 1, 0, -1, 0 };
    static int min = Integer.MAX_VALUE;
    static int n;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        a = new char[n][n];
        visited = new int[n][n];
        String str[] = new String[n];
        int startx = 0;
        int starty = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                a[i][j] = in.next().charAt(0);
                visited[i][j] = Integer.MAX_VALUE;
                if (a[i][j] == 'A') {
                    startx = i;
                    starty = j;
                }
            }
        }
        dfs(startx, starty, 0);
        if (min == Integer.MAX_VALUE)
            min = -1;
        System.out.println(min);
    }

    public static void dfs(int x, int y, int step) {
        visited[x][y] = step;
        if (a[x][y] == 'B') {
            min = Math.min(min, step);
            return;
        }
        for (int i = 0; i < 4; i++) {
            int xx = x + dx[i];
            int yy = y + dy[i];
            if (xx >= 0 && xx < n && yy >= 0 && yy < n && a[xx][yy] != a[x][y] && visited[x][y] + 1 < visited[xx][yy]) {
                dfs(xx, yy, step + 1);
            }
        }
    }
}

相关推荐

  1. 洛谷 P8628 [ 2015 国 AC] 穿越雷区

    2024-04-06 09:34:07       70 阅读
  2. 贪心+

    2024-04-06 09:34:07       65 阅读
  3. 简介

    2024-04-06 09:34:07       54 阅读
  4. 练习题

    2024-04-06 09:34:07       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-06 09:34:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-06 09:34:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-06 09:34:07       87 阅读
  4. Python语言-面向对象

    2024-04-06 09:34:07       96 阅读

热门阅读

  1. 每天学习一个Linux命令之ln

    2024-04-06 09:34:07       38 阅读
  2. 【无标题】

    2024-04-06 09:34:07       37 阅读
  3. es6的一些方法

    2024-04-06 09:34:07       40 阅读
  4. Github 2024-04-05 开源项目日报 Top10

    2024-04-06 09:34:07       41 阅读
  5. 如何利用GitHub和jsDelivr托管图片cdn

    2024-04-06 09:34:07       37 阅读
  6. 贝叶斯逻辑回归

    2024-04-06 09:34:07       33 阅读
  7. ubuntu16.04安装vscode那些事

    2024-04-06 09:34:07       34 阅读
  8. Swift:在 Win10 上编程入门

    2024-04-06 09:34:07       38 阅读
  9. C语言——找单身狗1

    2024-04-06 09:34:07       30 阅读
  10. 【数据库(MySQL)基础】以MySQL为例的数据库基础

    2024-04-06 09:34:07       30 阅读
  11. 统计字符串中a出现的个数

    2024-04-06 09:34:07       42 阅读