poj 3026 Borg Maze(BFS+Prim)

Borg Maze
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 11938   Accepted: 3899

题意:给定 T组测试数据。m行n列,#表示墙不能通过,空格可以通过,图中有S和A两种字母
每移动一个路权加一,求以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;
}


你可能感兴趣的:(poj 3026 Borg Maze(BFS+Prim))