poj 3026 Borg Maze(BFS+Prim)
2016-04-16 23:45
393 查看
Borg Maze
题意:给定 T组测试数据。m行n列,#表示墙不能通过,空格可以通过,图中有S和A两种字母
每移动一个路权加一,求以S为起点到达所有其它字母的最小距离。
思路:对于map,把字母当做图的顶点,先BFS遍历图中的字母到其它字母的路权,进而转化为
图的邻接矩阵,再对该邻接矩阵求最小生成树。
对于此题,我真是想骂人,BFS时,本来想少Node些节点,省些事,结果却忽略了一点,就是这,我直接用之前定义的D节点来存放搜索到的新节点,结果连转换出来的邻接矩阵都不对,当时脑子也是短路了,TMD搞了一下午愣是没找出来,最后看别人对的代码,改了又改,还是错的,最后一点一点的改,n多次后终于出来了,当时就想哭,本来想着改出来了,直接求最小生成树就OK了,结果。。。。 结果。。。。。 有刀没。。。。 我想砍人啊啊啊啊,提交Wrong
Answer,我尼玛........ 再开始找,找了一个晚上,原本以为是有些测试数据错了,就开始找算法的错误,找了一个晚上,结果没有.....
,最后
最后 ,我想砸电脑,真想砸个稀碎,更想打出这个题的那个脑残粉。当 n 和 m 读入完毕后,需要接收一个回车,重点 重点出现,就是这,不能用getchar()接收,必须要用gets(),尽管gets()里面的字符串长度定义为1,也必须要用它,至于为啥,表示不懂........... 欢迎知道的同胞给出解答。
总之,这个题做完后,真是快疯了,不要理我,,,,我想静静,也不要问我静静是谁.........
具体代码:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11938 | Accepted: 3899 |
每移动一个路权加一,求以S为起点到达所有其它字母的最小距离。
思路:对于map,把字母当做图的顶点,先BFS遍历图中的字母到其它字母的路权,进而转化为
图的邻接矩阵,再对该邻接矩阵求最小生成树。
对于此题,我真是想骂人,BFS时,本来想少Node些节点,省些事,结果却忽略了一点,就是这,我直接用之前定义的D节点来存放搜索到的新节点,结果连转换出来的邻接矩阵都不对,当时脑子也是短路了,TMD搞了一下午愣是没找出来,最后看别人对的代码,改了又改,还是错的,最后一点一点的改,n多次后终于出来了,当时就想哭,本来想着改出来了,直接求最小生成树就OK了,结果。。。。 结果。。。。。 有刀没。。。。 我想砍人啊啊啊啊,提交Wrong
Answer,我尼玛........ 再开始找,找了一个晚上,原本以为是有些测试数据错了,就开始找算法的错误,找了一个晚上,结果没有.....
,最后
最后 ,我想砸电脑,真想砸个稀碎,更想打出这个题的那个脑残粉。当 n 和 m 读入完毕后,需要接收一个回车,重点 重点出现,就是这,不能用getchar()接收,必须要用gets(),尽管gets()里面的字符串长度定义为1,也必须要用它,至于为啥,表示不懂........... 欢迎知道的同胞给出解答。
总之,这个题做完后,真是快疯了,不要理我,,,,我想静静,也不要问我静静是谁.........
具体代码:
#include <stdio.h> #include <string.h> #define INF 0x3f3f3f3f #include <queue> using namespace std; const int M=150; int x[4]={0,0,1,-1}; int y[4]={1,-1,0,0}; char map[M][M];//字符串地图 int cost[M][M];//邻接矩阵 int node[M][M];//记录不同的结点 int visit[M][M];//标记数组 int used[M];//标记 int dist[M]; int n,m,Node_num; struct Node { int x,y,w; }; void BFS(int a,int b) { queue<Node> Q; Node P={a,b,0};//Node一个节点存放起点 Q.push(P);//把起点入队 memset(visit,0,sizeof(visit)); visit[a][b]=1;//标记起点 while(!Q.empty()) { Node D=Q.front();//Node新节点存放队头节点状态 Q.pop(); if(node[D.x][D.y]!=0)//如果不等于0,说明此处是字母 //以P状态的字母为起点,D状态作为邻接点,此时的D.w作为权值存入邻接矩阵 cost[ node[P.x][P.y] ][ node[D.x][D.y] ]=D.w; for(int i=0;i<4;i++)//搜索周围的点 { int di=D.x+x[i]; int dj=D.y+y[i]; if(di>=1 && di<=n && dj>=1 && dj<=m)//边界判断 if(map[di][dj]!='#' && visit[di][dj]==0) { visit[di][dj]=1; Node t={di,dj,D.w+1};//Node新节点存放新节点状态 Q.push(t); } } } } int Prim() { memset(used,0,sizeof(used)); memset(dist,INF,sizeof(dist)); dist[1]=0; int ans=0,i,j; while(1) { int u=-1; for(i=1;i<=Node_num;i++) if(used[i]==0 && (u==-1 || dist[i]<dist[u])) u=i; if(u==-1) break; used[u]=1; ans+=dist[u]; for(j=1;j<=Node_num;j++) if(used[j]==0 && cost[u][j]<dist[j]) dist[j]=cost[u][j]; } return ans; } int main() { int T,i,j; char str[1]; scanf("%d",&T); while(T--) { memset(map,'#',sizeof(map)); memset(node,0,sizeof(node)); memset(cost,INF,sizeof(cost)); Node_num=0;//结点个数 scanf("%d%d",&m,&n); gets(str);//必须要用gets()接收回车,打死都不能用getchar() for(i=1;i<=n;i++) { gets(map[i]); for(j=1;j<=m;j++) if(map[i][j]=='S' || map[i][j]=='A') node[i][j]=++Node_num; } for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(node[i][j]!=0)//是字母则进行搜索 BFS(i,j); printf("%d\n",Prim()); } return 0; }
相关文章推荐
- 垃圾回收的经典算法
- Hibernate学习总结:OneToOne双向主键关联
- [CareerCup] 16.4 A Lock Without Deadlocks 无死锁的锁
- 使用友盟进行app的增量更新
- 怎样把ACCESS导入SQL数据库
- 让vscode完美支持go vendor的代码跳转(使用vscode必看)
- [Swift] Swift笔记
- 第七周作业
- PHP学习(十七)--继承性
- 说好了,在明年的今天我们继续
- easyui,datagrid表格显示的字段内容随机
- 使用补卡攻击微信银行卡案例
- 使用补卡攻击微信银行卡案例
- linux文件系统变为只读的修复
- hdu5665
- 第八课 linux一般执行过程(2)
- hdu-5665 Lucky(水题)
- Jersey(1.19.1) - Use of @Context
- Erlang服务器内存吃紧的优化解决方法
- poj1087 A Plug for UNIX 最大流