AcWing 1076. 迷宫问题(最少步数、输出路径)

题目链接:点击这里
在这里插入图片描述
在这里插入图片描述
将走过的路变成墙,即 0 0 置成 1 1 ,从而达到判重目的

输出路径:用结构体数组模拟队列,pre记录着前一个元素在队列数组中的下标,当到达终点时,往回递归回溯输出路径。

注意:BFS本身已包含最短的属性,所以只要到达了终点,那就是最短路线,输出即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 1010, M = N * N;

int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

struct node {
	int x, y, pre;          // pre记录前一个元素在队列数组中的下标
	node() {}
	node(int _x, int _y, int _p) : x(_x), y(_y), pre(_p) {}
};

int n;
int g[N][N];
int hh = 0, tt = -1;        // 队首和队尾
node q[M];                  // 数组模拟队列

void print(node t)
{
	if(t.pre == -1)
	{
	    printf("%d %d\n", t.x, t.y);
	    return;
	}
	
	print(q[t.pre]);
	
	printf("%d %d\n", t.x, t.y);
}

void bfs()
{
    q[++tt] = node(0, 0, -1);
    g[0][0] = 1;
    
    while(hh <= tt)
    {
        node t = q[hh];                                     // 取队首元素
        
        for(int i = 0; i < 4; ++i)
        {
            int nx = t.x + dx[i], ny = t.y + dy[i];
            
            if(nx < 0 || nx >= n || ny < 0 || ny >= n)  continue;
            if(g[nx][ny] == 1)  continue;
            
            q[++tt] = node(nx, ny, hh);
            g[nx][ny] = 1;
            
            if(nx == n - 1 && ny ==  n - 1)   return;     // 到达终点
        }
        
        hh++;                                             // 删队首元素
    }
}

int main()
{
    scanf("%d", &n);
    
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < n; ++j)
            scanf("%d", &g[i][j]);
    
    bfs();
    
    print(q[tt]);
    
    return 0;
}
发布了844 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/105064238