百练 10 迷宫问题

传送门

从起点到终点,叫你打印最短路的路径。设个结构体,记录前驱,和当前编号,找到那个终点的编号,递归输出坐标即可。

#include
#include
#include
#include
#include
#include
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
const int MAXN=30;
int dx[4]={0,0,1,-1};
int dy[4]={-1,1,0,0};
struct node{
    int x,y,pre,n;//pre和n表示前驱和当前点的编号
}point[MAXN];
int mp[5][5],vis[5][5];
int bfs(){
    memset(vis,0,sizeof(vis));
    int cnt=0;
    point[0]={0,0,-1,0};
    vis[0][0]=1;
    queueQ;
    Q.push(point[0]);
    node t;
    while(!Q.empty()){
        t=Q.front();
        Q.pop();
        int nowx=t.x,nowy=t.y,now=t.n;
        if(nowx==4&&nowy==4)return now;
        for(int i=0;i<4;i++){
            int gx=nowx+dx[i],gy=nowy+dy[i];
            if(gx<5&&gy<5&&gx>=0&&gy>=0&&mp[gx][gy]==0&&!vis[gx][gy])
            {vis[gx][gy]=1;
            point[++cnt]={gx,gy,now,cnt};
            Q.push(point[cnt]);
            }

        }
    }
}
void dfs(int x){
    if(point[x].n)dfs(point[x].pre);
    printf("(%d, %d)\n",point[x].x,point[x].y);
}

int main(){
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
            scanf("%d",&mp[i][j]);
    int ans=bfs();
    dfs(ans);
    return 0;
}

你可能感兴趣的:(百练 10 迷宫问题)