poj3026 Borg Maze
2011-01-29 14:21
134 查看
题目蛮简单的。思路:先用bfs求任意两点之间的最短距离(这里的两点指的是A或者是S),然后求最小生成树,即为答案。
这里有一个250的地方,就是在x,y之后要用gets()。
这里有一个250的地方,就是在x,y之后要用gets()。
#include<iostream> #include<cstdio> using namespace std; #define N 105 #define M 55 #define max_int 99999999 int cost ,dist ; int map[M][M]; char maze[M][M]; bool vis[M][M],s ; struct node { int i,j,step; }; node que[M*M],original,p ; int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; int choose(int n) { int m=max_int,pos=-1; for(int i=0;i<n;i++) if(dist[i]<m&&!s[i]) { m=dist[i]; pos=i; } return pos; } void prim(int n,int v) { int u,weight=0,i; memset(s,0,sizeof(s)); for(i=0;i<n;i++) dist[i]=max_int; dist[v]=0; while(1) { u=choose(n); if(u==-1) break; weight+=dist[u]; s[u]=1; for(i=0;i<n;i++) if(!s[i]&&dist[i]>cost[u][i]) dist[i]=cost[u][i]; } printf("%d/n",weight); return ; } void bfs(int s_i,int s_j) { int front=-1,rear=0,i,next_i,next_j; node temp,add; memset(vis,0,sizeof(vis)); que[0].i=s_i,que[0].j=s_j,que[0].step=0; vis[s_i][s_j]=1; while(front<rear) { temp=que[++front]; for(i=0;i<4;i++) { next_i=temp.i+dir[i][0]; next_j=temp.j+dir[i][1]; if(maze[next_i][next_j]!='#'&&!vis[next_i][next_j]) { vis[next_i][next_j]=1; add.i=next_i; add.j=next_j; add.step=temp.step+1; que[++rear]=add; } } } for(i=1;i<=rear;i++) if(maze[que[i].i][que[i].j]=='A'||maze[que[i].i][que[i].j]=='S') cost[map[que[0].i][que[0].j]][map[que[i].i][que[i].j]]= cost[map[que[i].i][que[i].j]][map[que[0].i][que[0].j]]= que[i].step; return ; } void init(int n) { int i,j,k; for(i=0;i<n;i++) for(j=i;j<n;j++) cost[i][j]=cost[j][i]=max_int; for(k=0;k<n;k++) map[p[k].i][p[k].j]=k; for(k=0;k<n;k++) bfs(p[k].i,p[k].j); return ; } int main() { int ca,x,y,i,j,k; char line[M]; scanf("%d",&ca); while(ca--) { k=0; scanf("%d%d",&x,&y); gets(line); for(i=1;i<=y;i++) { for(j=1;j<=x;j++) { maze[i][j]=getchar(); if(maze[i][j]=='A'||maze[i][j]=='S') { p[k].i=i; p[k].j=j; k++; } if(maze[i][j]=='S') { original.i=i; original.j=j; } } getchar(); } init(k); prim(k,map[original.i][original.j]); } return 0; }
相关文章推荐
- poj3026 Borg Maze
- POJ3026 Borg Maze BFS+Prime
- poj3026 Borg Maze (BFS+最小生成树)
- poj3026 Borg Maze
- poj3026 Borg Maze
- poj3026 Borg Maze bfs+最小生成树 prim
- UVa 10307 - Killing Aliens in Borg Maze
- POJ 3026 Borg Maze(BFS+Prim)
- POJ 3026 Borg Maze bfs + 最小生成树
- Poj 3026 Borg Maze
- Borg Maze——BFS+最小生成树
- POJ 3026 Borg Maze(bfs+最小生成树-Prim)
- POJ 3026 Borg Maze BFS+MST
- POJ 3026 Borg Maze BFS+最小生成树
- POJ 3026, Borg Maze
- J - Borg Maze——bfs+最小生成树_Prim算法
- POJ 3062 Borg Maze BFS+最小生成树
- POJ 3026 Borg Maze //qdu_cxsys_最小生成树
- poj3026——Borg Maze(BFS+最小生成树)
- POJ3026——Borg Maze