HDU1026 (BFS)

本文介绍了一种使用广度优先搜索(BFS)解决迷宫寻路问题的方法,并详细展示了如何通过记录路径来找到从起点到终点的最短路径及时间。该算法适用于地图上存在障碍物的情况。

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

题意:从起点到终点,输出路径长度,时间。

bfs+记录路径

View Code
  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<queue>
  5 const int N = 105;
  6 const int inf = 9999999;
  7 using namespace std;
  8 
  9 struct node{
 10     int x,y;
 11 };
 12 node p,pp,path[N][N];
 13 struct node2{
 14     int x1,y1,x2,y2;
 15 }out[1000005];
 16 
 17 char map[N][N];
 18 int time[N][N];
 19 int n,m,endflag,ans;
 20 queue<node>q;
 21 
 22 const int dx[]={1,-1,0,0};
 23 const int dy[]={0,0,1,-1};
 24 
 25 void init(){
 26     for(int i=0;i<N;i++)
 27         for(int j=0;j<N;j++){
 28             path[i][j].x=-1;
 29             path[i][j].y=-1;
 30             time[i][j]=inf;
 31         }
 32 }
 33 
 34 bool judge(int x,int y){
 35     if(map[x][y]>='1'&&map[x][y]<='9')
 36         return true;
 37     return false;
 38 }
 39 
 40 void output(){
 41     int nowx,nowy,tpx,tpy,cnt=1;
 42     nowx=n-1;
 43     nowy=m-1;
 44     while(nowx!=0||nowy!=0){
 45         out[cnt].x1=path[nowx][nowy].x;
 46         out[cnt].y1=path[nowx][nowy].y;
 47         out[cnt].x2=nowx;
 48         out[cnt++].y2=nowy;
 49         tpx=nowx;
 50         tpy=nowy;
 51         nowx=path[tpx][tpy].x;
 52         nowy=path[tpx][tpy].y;
 53     }
 54 
 55     int cnt2=1;
 56     for(int i=cnt-1;i>=1;i--)
 57     {
 58         if(judge(out[i].x1,out[i].y1)==false)
 59             printf("%ds:(%d,%d)->(%d,%d)\n",cnt2++,out[i].x1,out[i].y1,out[i].x2,out[i].y2);
 60         else
 61         {
 62             int pp;
 63             pp=map[out[i].x1][out[i].y1]-'0';
 64             for(int j=1;j<=pp;j++)
 65                 printf("%ds:FIGHT AT (%d,%d)\n",cnt2++,out[i].x1,out[i].y1);
 66             printf("%ds:(%d,%d)->(%d,%d)\n",cnt2++,out[i].x1,out[i].y1,out[i].x2,out[i].y2);
 67         }
 68     }
 69     if(endflag!=-1){
 70     int pp;
 71     pp=endflag;
 72         for(int j=1;j<=pp;j++)
 73             printf("%ds:FIGHT AT (%d,%d)\n",cnt2++,n-1,m-1);
 74     }
 75     printf("FINISH\n");
 76 }
 77 
 78 void bfs(){
 79     int i,j,k;
 80     ans=inf;
 81     endflag=-1;
 82     while(!q.empty())q.pop();
 83     p.x=0;
 84     p.y=0;
 85     time[p.x][p.y]=0;
 86     if(judge(0,0)==true)
 87         time[0][0]=map[0][0]-'0';
 88     q.push(p);
 89     while(!q.empty()){
 90         p=q.front();
 91         q.pop();
 92         
 93         if(p.x==n-1&&p.y==m-1)
 94             if(time[n-1][m-1]<ans)
 95                 ans=time[n-1][m-1];
 96                 
 97         for(i=0;i<4;i++){
 98             pp.x=p.x+dx[i];
 99             pp.y=p.y+dy[i];
100             if(pp.x<0||pp.x>=n||pp.y<0||pp.y>=m)
101                 continue;
102             if(map[pp.x][pp.y]=='X')
103                 continue;
104             if(map[pp.x][pp.y]=='.'&&time[pp.x][pp.y]>(time[p.x][p.y]+1)){
105                 time[pp.x][pp.y]=time[p.x][p.y]+1;
106                 path[pp.x][pp.y].x=p.x;
107                 path[pp.x][pp.y].y=p.y;
108                 q.push(pp);
109             }
110             if(map[pp.x][pp.y]>='1'&&map[pp.x][pp.y]<='9'){
111                 if(time[pp.x][pp.y]>(time[p.x][p.y]+map[pp.x][pp.y]-'0'+1)){
112                     time[pp.x][pp.y]=time[p.x][p.y]+map[pp.x][pp.y]-'0'+1;
113                     path[pp.x][pp.y].x=p.x;
114                     path[pp.x][pp.y].y=p.y;
115                     if(pp.x==n-1&&pp.y==m-1){
116                         endflag=map[pp.x][pp.y]-'0';
117                     }
118                     q.push(pp);
119                 }
120             }
121         }
122     }
123     
124     if(ans!=inf){
125         printf("It takes %d seconds to reach the target position, let me show you the way.\n",ans);
126         output();
127     }
128     else
129         printf("God please help our poor hero.\nFINISH\n");
130     return ;
131 }
132 
133 int main(){
134     int i;
135     while( scanf("%d%d",&n,&m)!=EOF ){
136         memset(map,0,sizeof(map));
137         for(i=0;i<n;i++)
138             scanf("%s",map[i]);
139         init();
140         bfs();
141     }
142     return 0;
143 }            

 

转载于:https://www.cnblogs.com/xxx0624/archive/2013/01/29/2880862.html

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值