7-1 求解迷宫从入口到出口的一条最短路径

题目详情

求解迷宫从入口到出口的一条最短路径。输入一个迷宫,求从入口通向出口的一条可行最短路径。为简化问题,迷宫用二维数组 int maze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入, 若读入迷宫大小的值是n(3<n<=10),则该迷宫横向或纵向尺寸都是n,规定迷宫最外面的一圈是障碍物,迷宫的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1代表该位置是障碍物,若maze[i][j] = 0代表该位置是可以行走的空位(0<=i<=n-1, 0<=j<=n-1)。求从入口maze[1][1]到出口maze[n-2][n-2]可以走通的路径。要求迷宫中只允许在水平或上下四个方向的空位上行走,走过的位置不能重复走,规定必须按向右、向下、向左、向上的顺序向前搜索试探,输出先到达出口的最短路径。
如下这样一个迷宫:
在这里插入图片描述
对应的二维数组表示:
int maze[10][10]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,1,1},
{1,0,0,0,1,0,0,0,1,1},
{1,0,1,0,0,0,1,0,0,1},
{1,1,1,1,0,1,1,0,1,1},
{1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}};

输入格式:
输入迷宫大小的整数n, 以及n行和n列的二维数组(数组元素1代表障碍物,0代表空位)。

输出格式:
输出按规定搜索试探顺序先到达出口的首条最短路径,依次输出从入口到出口可行最短路径每个位置的行列下标(i,j),每个位置间用“,”分隔。若没有通路,输出:NO。

输入样例1:

4
1 1 1 1
1 0 1 1
1 0 0 1
1 1 1 1

输出样例1:

(1,1)(2,1)(2,2)

输入样例2:

10
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 1 0 1
1 0 0 1 0 0 0 1 0 1
1 0 0 0 0 1 1 0 0 1
1 0 1 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0 0 1
1 0 1 0 0 0 1 0 0 1
1 0 1 1 1 0 1 1 0 1
1 1 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1

输出样例2:

(1,1)(2,1)(3,1)(4,1)(5,1)(5,2)(5,3)(6,3)(6,4)(6,5)(7,5)(8,5)(8,6)(8,7)(8,8)

法1:回溯法、栈

import java.util.Objects;
import java.util.Scanner;
import java.util.Stack;

public class Main {

  static int[][] map;
  static Stack<XY> path;
  static Stack<XY> bestPath;
  static int[][] passed;

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    path = new Stack<>();
    bestPath = new Stack<>();
    map = new int[n][n];
    passed = new int[map.length][map.length];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        map[i][j] = scanner.nextInt();
      }
    }
    Main main = new Main();
    XY start = new XY(1, 1);
    XY end = new XY(n-2, n-2);
    if (!start.isAccess()|| !end.isAccess()) {
      System.out.println("NO");
      return;
    }
    main.dfs(start);
    if (bestPath.isEmpty()) {
      System.out.println("NO");
    } else {
      bestPath.forEach(xy -> {
        System.out.print(xy);
      });
    }
  }

  public void dfs(XY xy) {
    xy.setPassed();
    path.push(xy);
    if (xy.isEnd()) {
      if (bestPath.isEmpty() || bestPath.size() >= path.size()) {
        bestPath.removeAll(bestPath);
        bestPath.addAll(path);
      }
      path.pop();
      passed[xy.x][xy.y]=0;
      return;
    }

    //down
    XY down = new XY(xy.x + 1, xy.y);
    if (down.isAccess()) {
      dfs(down);
    }
    //right
    XY right = new XY(xy.x, xy.y + 1);
    if (right.isAccess()) {
      dfs(right);
    }
    //left
    XY left = new XY(xy.x, xy.y - 1);
    if (left.isAccess()) {
      dfs(left);
    }
    //up
    XY up = new XY(xy.x - 1, xy.y);
    if (up.isAccess()) {
      dfs(up);
    }
    path.pop();
    passed[xy.x][xy.y]=0;
  }

}

class XY {

  int x;
  int y;

  public XY() {
  }

  public XY(int x, int y) {
    this.x = x;
    this.y = y;
  }

  boolean isAccess() {
    if (x < 1 || x > Main.map.length - 2 || y < 1 || y > Main.map[0].length - 2
        || Main.map[x][y] == 1 || Main.path.contains(this) || Main.passed[x][y] == 1) {
      return false;
    }
    return true;
  }

  void setPassed() {
    Main.passed[x][y] = 1;
  }


  boolean isEnd() {
    return x == Main.map.length - 2 && x == y;
  }

  @Override
  public String toString() {
    return "(" + x + "," + y + ")";
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (!(o instanceof XY)) {
      return false;
    }
    XY xy = (XY) o;
    return x == xy.x && y == xy.y;
  }

  @Override
  public int hashCode() {
    return Objects.hash(x, y);
  }
}

法2 队列

待码…

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以上代码段是一个Python脚本的一部分。在这段代码中,首先我们导入了一个YOLO模型,并指定了训练好的权重文件的路径。接下来,我们使用这个模型进行物体检测的操作。这段代码的作用是加载模型,并使用该模型对指定的图片进行物体检测。 引用中的代码段展示了如何使用训练好的权重进行图片检测。我们可以使用命令行工具来运行这个脚本,指定需要检测的图片路径、权重文件路径以及置信度阈值。 请注意,这是一个代码段,并不是完整的程序。所以在这段代码中,缺少了主程序的入口函数if __name__ == '__main__'。这个条件判断语句通常用于指定当这个脚本作为主程序运行时执行的操作。 在这个代码段中,我们加载了一个YOLO模型,并指定了训练好的权重文件的路径。这个权重文件包含了模型在训练过程中学到的参数。通过加载这个权重文件,我们可以使用这个模型进行物体检测。 需要注意的是,这个代码段中的权重文件路径是相对路径,具体路径可能需要根据实际情况进行修改。此外,这个代码段中的YOLO模型的初始化可能还需要其他参数,比如类别数和类别名称等。 综上所述,这段代码的作用是加载一个YOLO模型,并使用该模型对指定的图片进行物体检测。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Ubuntu 18.04 YOLOv5 ros_yolo 环境配置 数据集标注](https://blog.csdn.net/weixin_43563233/article/details/114385130)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值