• 洛谷bfs题2---P1825 [USACO11OPEN] Corn Maze S


    P1825 [USACO11OPEN] Corn Maze S

    1. import java.util.LinkedList;
    2. import java.util.Queue;
    3. import java.util.Scanner;
    4. public class Main {
    5. public static int N;//行
    6. public static int M;//列
    7. public static Queue q = new LinkedList<>();
    8. public static int[] x = new int[]{1, -1, 0, 0};
    9. public static int[] y = new int[]{0, 0, 1, -1};
    10. public static char[][] map = new char[305][305];
    11. public static int[][] visit = new int[305][305];
    12. public static int[][] step = new int[305][305];
    13. public static int flag = 0;
    14. public static void main(String[] args) {
    15. Scanner scan = new Scanner(System.in);
    16. N = scan.nextInt();
    17. M = scan.nextInt();
    18. for (int i = 0; i < N; i++) {
    19. map[i] = scan.next().toCharArray();
    20. }
    21. bfs();
    22. }
    23. public static void bfs() {
    24. int f = 0;
    25. for (int i = 0; i < N; i++) {
    26. for (int j = 0; j < M; j++) {
    27. if (map[i][j] == '@') {
    28. q.add(i);
    29. q.add(j);
    30. step[i][j] = 0;
    31. visit[i][j] = 1;
    32. f = 1;
    33. break;
    34. }
    35. }
    36. if (f == 1) {
    37. break;
    38. }
    39. }
    40. while (!q.isEmpty()) {
    41. int row = q.poll();
    42. int col = q.poll();
    43. boolean flag = true;
    44. int x1=row;
    45. int y2=col;
    46. if(map[row][col]=='='){
    47. System.out.println(step[row][col]);
    48. return;
    49. }
    50. if (map[row][col] >= 'A' && map[row][col] <= 'Z') {
    51. for (int i = 0; i < N && flag; i++) {
    52. for (int j = 0; j < M && flag; j++) {
    53. if (map[i][j] == map[row][col] && (i != row || j != col)) {
    54. row = i;
    55. col = j;
    56. flag = false;
    57. }
    58. }
    59. }
    60. }
    61. for (int i = 0; i < 4; i++) {
    62. int r = row + x[i];
    63. int c = col + y[i];
    64. if(r>=0&&r=0&&c0&&map[r][c]!='#'){
    65. step[r][c]=step[x1][y2]+1;
    66. visit[r][c]=1;
    67. q.add(r);
    68. q.add(c);
    69. }
    70. }
    71. }
    72. }
    思路:

    这道题与往常的模板有一个小小的不同,往常是将预备入队的元素进行检查,如果发现有我们需要的答案则直接结束,输出step+1,而如果有可以继续走的元素则入队,step+1.

    而这题我们是将将要出队的元素进行检查。

     

    因为如果出队的是装置,我们就会跳到另外一个装置,然后对这个装置的四周进行判断是否要入队。而判断是否入队则是不是'#'就可以入队了

    如果出队的恰好是'=',我们就可以直接输出这个元素的step了。

    注意点:
    1. int x1=row;
    2. int y2=col;

    如果出队的是装置,那么我们要保留这个原装置的步数,因为如果我们把原装置的步数赋值给新装置,那么新装置自己的步数就被覆盖掉了,当进行下一次这个新装置出队时,又跳跃到旧,这个步数就是错的。这个就是测试点8的注意点。

  • 相关阅读:
    Maven小问题集-No.1
    Go语言学习笔记——访问权限控制框架casbin
    N种实用功能,助力企业智破服务难题
    JAVA经典百题之按位与运算符 `&`的使用
    03.2 线性回归的从零开始实现
    干性湿疹和湿性湿疹
    难度大幅上涨!初试公共/专业课都改了!东南大学软件学院考研
    [附源码]java毕业设计四六级考试管理系统
    第二章计算机网络参考模型
    chrome历史版本下载
  • 原文地址:https://blog.csdn.net/m0_73866527/article/details/133256006