7-8 迷宫探路 (20 分)

本题目要求读入2个整数A和B,表示A行B列的迷宫,迷宫中有障碍点。给定起始点和终止点,要求从起始点到终止点的最小步数。

输入格式:

输入n组如下的数: 输入2个整数A和B,表示A行B列的迷宫,然后输入一个整数C,表示障碍点数,再依次输入C个障碍点的坐标(x,y),最后输入起始点和终止点的坐标(xs,ys)和(xe,ye)。

输出格式:

针对每组数,输出从起始点到终止点的最小步数。若无法达到,则输出“Not arrive”。

输入样例:

在这里给出一组输入。例如:

2
5 5
3
0 2
3 4
1 1
0 1
4 4
3 3
2
0 1
1 2
0 0
2 2

输出样例:

在这里给出相应的输出。例如:

9
4

 无法达到,则输出“Not arrive”的处理办法:
先设置一个很大的数初始化最小步数,如果搜索后还是这个数,说明这个步数根本没被更新过,说明不能到达

优化方法:

因为是算最短步数,两点之间的跨越不带权值,那么原本我们需要再设置一个数组标记是否走过,我们可以简化到地图上标记,走过也就相当于障碍物不能再走,就把这个位置在地图上标记为2,回溯的时候再另他为0 。就可以简化为一个二维数组。

#include<bits/stdc++.h>
using namespace std;
int sx,sy,ex,ey,minn;
int mapp[10000][10000];//数组不要开太大了哦不然会内存超限的
int h,l,m;
void dfs(int x,int y,int step)
{
    int next[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};

    if(x==ex&&y==ey)//到达终点
    {
        //更新最小值
        if(step<minn)
            minn=step;
        return;
    }
    for(int k=0; k<4; k++)
    {
        int tx=x+next[k][0];
        int ty=y+next[k][1];
        if(tx<0||tx>=h||ty<0||ty>=l)
            continue;
        if(mapp[tx][ty]==0)
        {
            mapp[tx][ty]=2;
            dfs(tx,ty,step+1);
            mapp[tx][ty]=0;//记得回溯
        }
    }
    return ;//别忘了哦
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        cin>>h>>l;//地图行列
        cin>>m;
        while(m--)
        {
            int a,b;
            cin>>a>>b;
            mapp[a][b]=1;//障碍处标为1
        }
        cin>>sx>>sy>>ex>>ey;//输入起点终点坐标

        minn=99999999;//先设最短路径为不可达到的大数字
        mapp[sx][sy]=2;//先标记起点为路径中的点
        dfs(sx,sy,0);//从起点开始搜索

        if(minn<99999999)
            cout<<minn;
        else
            cout<<"Not arrive";
        if(n!=0)cout<<endl;
        memset(mapp,0,sizeof(mapp));
    }
    return 0;
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
迷宫探路机器人最短路径算法可以使用广度优先搜索(BFS)算法来实现。具体实现过程如下: 1. 将起点加入队列,并将其标记为已访问。 2. 不断从队列中取出元素,向其周围未访问的位置进行探索。 3. 如果探索到终点,则返回当前路径的长度。 4. 否则,将周围未访问的位置加入队列,并标记为已访问。 5. 重复2-4步骤,直到队列为空。 在实现中,可以使用一个二维数组来表示迷宫地图,0表示空地,1表示障碍物。同时,可以使用一个二维数组来记录每个位置是否已经被访问过。在搜索过程中,需要记录每个位置的前驱节点,以便在搜索完成后能够还原最短路径。 以下是Python实现代码示例: ``` from collections import deque def bfs(maze, start, end): # 记录每个位置是否已经被访问过 visited = [[False] * len(maze[0]) for _ in range(len(maze))] visited[start[0]][start[1]] = True # 记录每个位置的前驱节点 pre = [[None] * len(maze[0]) for _ in range(len(maze))] pre[start[0]][start[1]] = start queue = deque([(start[0], start[1], 0)]) while queue: x, y, step = queue.popleft() for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]: nx, ny = x + dx, y + dy if 0 <= nx < len(maze) and 0 <= ny < len(maze[0]) and not visited[nx][ny] and maze[nx][ny] == 0: visited[nx][ny] = True pre[nx][ny] = (x, y) if (nx, ny) == end: path = [(nx, ny)] while path[-1] != start: path.append(pre[path[-1][0]][path[-1][1]]) return step + 1, path[::-1] queue.append((nx, ny, step + 1)) return -1, [] ``` 其中,maze为迷宫地图,start为起点坐标,end为终点坐标。函数返回最短路径的长度和路径上的所有坐标。如果无法到达终点,则返回-1和空列表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值