8807aaaa 2023-11-16 00:35 采纳率: 0%
浏览 94

军犬寻找宝物,算法求解

【问题描述】
正方形(左下角坐标为(0,0),右上角坐标为(99,99))的格网地图上,有一只军犬要寻找一个宝物,格网上除了军犬与宝物之外,还有一些障碍物。一般情况下,只要不超出格网的边界,军犬的每一步最多有8个方向可供选择,如图1所示;但是必须注意,只有在A点没有障碍物时才可以选择方向1或方向2,只有在B点没有障碍物时才可以选择方向3或方向4,只有在C点没有障碍物时才可以选择方向5或方向6,只有在D点没有障碍物时才可以选择方向7或方向8。如果军犬可以从出发的位置走到宝物的位置,其总共使用的步数,理论上应有一个最小值;但是军犬也有可能无法走到宝物的位置。过程中,军犬不可以走到障碍物的位置上。
请设计算法并编写程序,若军犬可以从最初位置走到宝物的位置时,请输出其使用的最少步数;如果军犬无法到达宝物的位置,请输出字符串“impossible”。
【输入格式】:
第一行为一个整数n,代表障碍物的个数,0 ≤ n ≤ 1000。接下来的n行,每行表示一个障碍物的坐标,其横坐标值与纵坐标值间以一个空白隔开。
再下来的一行,表示军犬的最初位置,其横坐标值与纵坐标值间以一个空白隔开。最后一行,代表宝物的位置,其横坐标值与纵坐标值间以一个空白隔开。注意:输入之障碍物、军犬、宝物皆在不同位置。所有横、纵坐标值均为介于0(含)至99(含)之间的整数。
【输出格式】:
依行走之规则,若军犬可以从其位置走到宝物的位置时,请输出其使用之最少步数;如果军犬无法到达宝物的位置,请输出字符串“impossible”。
【输入样例】:
4
3 6
4 5
5 4
6 3
3 3
7 5
2
1 1
0 2
0 1
4 3
【输出样例】:
2
Impossible

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-16 10:37
    关注

    【以下回答由 GPT 生成】

    解决方案

    我会使用广度优先搜索算法(BFS)来解决这个问题。BFS是一种用于图的遍历和搜索的算法,它从一个顶点开始,逐层遍历图中的节点,直到找到目标节点为止。在这个问题中,我们可以将每一个格网看作图中的一个节点,根据给定的规则,我们可以从军犬的初始位置开始,逐层遍历相邻的节点,直到找到宝物的位置或者遍历完所有的节点。

    具体的步骤如下:

    1. 从输入中获取障碍物的数量和位置,军犬的初始位置和宝物的位置。
    2. 创建一个visited数组,用于记录已经访问过的节点。
    3. 创建一个队列,用于进行BFS的遍历。
    4. 将军犬的初始位置加入队列,并将其标记为已访问。
    5. 创建一个步数变量,初始化为0,用于记录军犬的移动步数。
    6. 进入一个循环,直到队列为空:
    7. 从队列中取出一个节点,将其作为当前节点。
    8. 如果当前节点是宝物的位置,返回步数值作为结果。
    9. 根据当前节点的位置和规则,分别将可能的下一个节点加入队列,如果未被访问过,并将其标记为已访问。
    10. 将步数加1。
    11. 如果循环结束仍然没有找到宝物的位置,返回"impossible"作为结果。

    下面是使用Python实现的代码:

    from collections import deque
    
    def bfs_search(obstacles, start, target):
        visited = [[False] * 100 for _ in range(100)]  # 创建visited数组,默认为False
        queue = deque()  # 创建队列
        queue.append(start)  # 将军犬的初始位置加入队列
        visited[start[0]][start[1]] = True  # 标记军犬的初始位置为已访问
        steps = 0  # 步数变量,记录军犬的移动步数
    
        while queue:
            current = queue.popleft()  # 取出队列中的一个节点,作为当前节点
    
            if current == target:  # 如果当前节点是宝物的位置,返回步数值作为结果
                return steps
    
            # 根据当前节点的位置和规则,分别将可能的下一个节点加入队列,如果未被访问过,并将其标记为已访问
            for direction in get_possible_directions(current):
                next_position = get_next_position(current, direction)
    
                if is_valid_position(next_position, obstacles) and not visited[next_position[0]][next_position[1]]:
                    queue.append(next_position)
                    visited[next_position[0]][next_position[1]] = True
    
            steps += 1  # 将步数加1
    
        return "impossible"  # 如果循环结束仍然没有找到宝物的位置,返回"impossible"
    
    def get_possible_directions(position):
        x, y = position
        directions = []
    
        if x % 2 == 0:
            if y > 0:
                directions.append(1)
            if y < 99:
                directions.append(2)
        else:
            if y > 0:
                directions.append(3)
            if y < 99:
                directions.append(4)
        if x < 99:
            directions.append(5)
        if y < 99:
            directions.append(6)
        if x % 2 == 0:
            if y > 0:
                directions.append(7)
            if y < 99:
                directions.append(8)
    
        return directions
    
    def get_next_position(position, direction):
        x, y = position
    
        if direction == 1:
            return (x, y - 1)
        elif direction == 2:
            return (x, y + 1)
        elif direction == 3:
            return (x - 1, y - 1)
        elif direction == 4:
            return (x - 1, y + 1)
        elif direction == 5:
            return (x + 1, y)
        elif direction == 6:
            return (x, y + 1)
        elif direction == 7:
            return (x + 1, y - 1)
        elif direction == 8:
            return (x + 1, y + 1)
    
    def is_valid_position(position, obstacles):
        x, y = position
    
        if position in obstacles:
            return False
    
        return 0 <= x <= 99 and 0 <= y <= 99
    
    
    # 输入处理
    n = int(input())
    obstacles = []
    for _ in range(n):
        obstacles.append(tuple(map(int, input().split())))
    start = tuple(map(int, input().split()))
    target = tuple(map(int, input().split()))
    
    # 调用算法
    result = bfs_search(obstacles, start, target)
    
    # 输出结果
    print(result)
    

    这个代码通过广度优先搜索算法实现了军犬寻找宝物的最少步数算法。它首先根据输入获取到障碍物、起始位置和目标位置的信息,然后调用bfs_search函数执行实际的搜索过程,并返回结果。最后,通过打印结果来输出答案.

    希望这个解决方案对你有帮助!如果你有任何问题,请随时提问。



    【相关推荐】


    • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7743683
    • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 我们老师给我们花了100个星星的重要,那就是非常重要,快速排序。名字就很嚣张。。。言归正传,快排采用了分治算法。把大问题,分解成小问题。首先我们先找一个基准值,基准值的寻找法,有很多,这里我先用一个取边上值得方法,找到基准值以后呢拿着这个基准值和所有数组比较,使这个数组中比基准值小的都放左边,比基准值大的都放到右边,然后就把原来数组分成三块,中间基准值,左边都是比它小的,右边都是比它大的。然后这两个数组,继续分,一直分。直到他的终止条件,也就是小数组有序了就停止,那么什么时候有序停止呢?小区间长度为1或者长度为0的时候,就是有序了。所有小数组都有序了,那么就是整个数组有序了。只是原理,那么问题,又来了,怎么放左放右呢?我目前会三种。 部分也许能够解决你的问题。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月16日

悬赏问题

  • ¥25 matlab可以将微分方程的解显示为相图形式吗
  • ¥35 Hadoop实训论文成品!任意标题价格可私急
  • ¥35 Hadoop实训论文成品!任意标题价格可私急
  • ¥15 全网 智慧园区系统 那个最好,希望推荐
  • ¥15 笔记本电脑持续蓝屏重启,昨晚放电后乱点进入indyde
  • ¥15 cloudflare域名已经用了一年了,突然之间finalshell证书签发错误怎么解决
  • ¥15 近端策略优化 PPO | 损失值计算问题
  • ¥20 高通移动端,安卓12,如何让wifi无视国家码启动6Gwifi,重新开机无需干涉自动连接
  • ¥15 程序实在不会写,要秃了
  • ¥15 pycharm导入不了自己的包