您的位置:首页 > 其它

poj3026 Borg Maze

2011-01-29 14:21 134 查看
题目蛮简单的。思路:先用bfs求任意两点之间的最短距离(这里的两点指的是A或者是S),然后求最小生成树,即为答案。

这里有一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: