hdu1026 Ignatius and the Princess I bfs+打印路径

本文深入探讨了一种基于优先队列的迷宫寻路算法,通过BFS(宽度优先搜索)策略,实现从起点到终点的最短路径寻找,并记录路径上的详细信息。文章详细解释了算法的实现过程,包括节点结构定义、优先级队列应用以及路径回溯打印,为读者提供了清晰的代码示例和理解路径寻找机制的视角。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <bits/stdc++.h>
using namespace std;
const int maxn=105;
int n,m;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int vis[maxn][maxn];
struct node{
    int x,y,time,prex,prey;
    friend    bool operator<(node mq,node mp) 
    {
        return mq.time>mp.time;
    }
}mp[maxn][maxn];
priority_queue<node>que;
int bfs(){
    while(que.size()){
        node cur=que.top();
        if(cur.x==n-1&&cur.y==m-1) return cur.time;
        que.pop();
        for(int i=0;i<4;i++){
            int dx=cur.x+dir[i][0];
            int dy=cur.y+dir[i][1];
            if(dx<0||dx>=n||dy<0||dy>=m||mp[dx][dy].time==-1||vis[dx][dy])
            continue;
            vis[dx][dy]=1;
            mp[dx][dy].time+=cur.time+1;
            mp[dx][dy].prex=cur.x; mp[dx][dy].prey=cur.y;
            que.push(mp[dx][dy]);
        }
    }
    return -1;
}
void printPath(int x,int y){
    if(x==0&&y==0) return;
    int nx=mp[x][y].prex;
    int ny=mp[x][y].prey;
    printPath(nx,ny);
    int pret=mp[nx][ny].time;
    int nt=mp[x][y].time;
    cout<<pret+1<<"s:("<<nx<<","<<ny<<")->("<<x<<","<<y<<")"<<endl;
    for(int i=pret+2;i<=nt;i++)
    cout<<i<<"s:FIGHT AT ("<<x<<","<<y<<")"<<endl;
}
int main(){
    while(cin>>n>>m){
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                char ch; int t;
                cin>>ch;
                if(ch=='.') t=0;
                else if(ch=='X') t=-1;
                else if(ch>='1'&&ch<='9')
                t=ch-'0'; 
                mp[i][j].x=i; mp[i][j].y=j;
                mp[i][j].time=t;
            }
        }
        while(que.size()) que.pop();
        que.push(mp[0][0]);
        vis[0][0]=1;
        if(bfs()==-1){
            cout<<"God please help our poor hero."<<endl;
            cout<<"FINISH"<<endl;
            continue;
        }
        else{
            cout<<"It takes "<<mp[n-1][m-1].time<<" seconds to reach the target position, let me show you the way."<<endl;
            printPath(n-1,m-1);
            cout<<"FINISH"<<endl;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值