POJ_3026_Borg Maze(BFS+最小生成树)
来源:互联网 发布:知乎如何将答案离线 编辑:程序博客网 时间:2024/06/02 03:04
题型:搜索+图论
题意:
题意好难读的说%>_<%~
在m*n的地图中,#代表墙壁,空格代表能走的区域,只能上下左右走,求将所有的“A”以及“S”点连起来的最短路径。
分析:
首先要注意输入,显示列数然后是行数,然后用gets()吃掉scanf留下的回车符(用getchar()不行)。
记下所有的“A”以及“S”的位置后,BFS搜索出每一个“A”("S"也算“A”的一种)到其他“A”点的最短路径,存在邻接矩阵里,需要注意的是,当从一个“A”找到找到其他“A”之后,继续往下搜索出其他的“A”点知道所有的“A”点都被找出来,而不是从原来的“A”重新开始寻找,因为这样会TLE......
邻接矩阵建立好之后就用Prim算法求出最小生成树。
代码:
#include<iostream>#include<cmath>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int INF = 0x7f7f7f7f;int n,m;int cnt;char map[55][55];bool vis[55][55];struct Point { int x,y,step;} p[105];int dir1[]= {0,0,1,-1};int dir2[]= {1,-1,0,0};int path[105][105],list[105];bool check(Point a) { if(a.x>0 && a.x<=n && a.y>0 && a.y<=m && vis[a.x][a.y]!=true && map[a.x][a.y]!='#') return true; else return false;}void bfs(Point start,int order) { int num=0; queue<Point> q; Point vn,vm; q.push(start); vis[start.x][start.y]=true; while(!q.empty()) { vn=q.front(); q.pop(); for(int i=0; i<4; i++) { vm.x=vn.x+dir1[i]; vm.y=vn.y+dir2[i]; vm.step=vn.step+1; if(check(vm)) { if(map[vm.x][vm.y]=='A' || map[vm.x][vm.y]=='s'){ for(int j=0;j<cnt;j++){ if(vm.x==p[j].x && vm.y==p[j].y){ path[order][j]=path[j][order]=vm.step; num++; break; } } if(num==cnt-1) return; } q.push(vm); vis[vm.x][vm.y]=true; } } }}int main() { int t; scanf("%d",&t); while(t--) { char tmp[55]; scanf("%d%d",&m,&n); gets(tmp); cnt=1; for(int i=1; i<=n; i++) { gets(map[i]); for(int j=1; j<=m; j++) { if(map[i][j]=='S') { p[0].x=i; p[0].y=j; p[0].step=0; } else if(map[i][j]=='A') { p[cnt].x=i; p[cnt].y=j; p[cnt++].step=0; } } } memset(path,INF,sizeof(path)); memset(list,INF,sizeof(list)); for(int i=0; i<cnt; i++) { memset(vis,false,sizeof(vis)); bfs(p[i],i); }/* for(int i=0;i<cnt;i++){ for(int j=0;j<cnt;j++){ cout<<path[i][j]<<" "; } cout<<endl; }*/ int dis,next; int ans=0; list[0]=-1; int s=0; while(1) { dis=INF; next=-1; for(int i=0; i<cnt; i++) { list[i]=min(list[i],path[i][s]); if(list[i]<dis&&list[i]!=-1) { dis=list[i]; next=i; } } if(next==-1) break; ans+=dis; s=next; list[s]=-1; } printf("%d\n",ans); } return 0;}
0 0
- POJ_3026_Borg Maze(BFS+最小生成树)
- POJ_3026_Borg Maze(BFS+最小生成树)
- POJ_3026_Borg Maze_最小生成树
- POJ3026Borg Maze(BFS+prim最小生成树)
- Borg Maze (bfs+最小生成树)
- poj 3026 Borg Maze 最小生成树+bfs
- POJ 3026 Borg Maze bfs + 最小生成树
- poj 3026 Borg Maze bfs建图+最小生成树
- poj 3026 Borg Maze (bfs+最小生成树)
- POJ 3026 Borg Maze【BFS+最小生成树】
- POJ 3026 Borg Maze (最小生成树 + BFS)
- POJ 3026 Borg Maze(BFS+最小生成树)
- POJ训练计划3026_Borg Maze(最小生成树+BFS)
- poj 3026 Borg Maze (bfs + 最小生成树)
- Borg Maze——BFS+最小生成树
- poj3026Borg Maze(bfs预处理+最小生成树)
- POJ 3026 Borg Maze (bfs+最小生成树)
- poj 3026 Borg Maze bfs+最小生成树
- SAS学习笔记(三)——关于PERCENT用法注意
- 问题 E : 31
- Brackets - 强大免费的开源跨平台Web前端开发工具
- MFC的消息映射机制
- Redis "MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on di
- POJ_3026_Borg Maze(BFS+最小生成树)
- linux学习不错的网站
- Nyoj-189 兔子的烦恼(一)
- MVC与开源框架
- 基于TQ2440的u-boot 1.1.6移植(一)(文件裁剪、时钟修改)
- C++ error: 无法启动此程序,因为计算机丢失liblas.dll
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(1)GCC介绍及C语言编译过程
- bombing:6证书认证系统设计与实现-改进与思考
- Ubuntu 12.04 LTS 中文输入法安装