码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3026 Borg Maze

时间:2015-01-23 09:32:51      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

 

 

/*
*POJ 3026 Borg Maze
*题意:
*从S处开始搜索 每遇到A 便会分裂 分裂出来的会继续搜索
*问最终所走的最小步数和
*/
/*
*思路:
*首先BFS所有A或S 求任意两点之间的距离 构建dist数组
*求dist的最小生成树
*/
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define INF 1000
int mark, n;
int map[55][55]; //存储地图及节点的编号
int lowcost[101]; //合并标记
int dist[101][101]; //邻接矩阵
bool visit[55][55]; //BFS 访问标记
int col, row;
struct Point {
	int x, y;
	int step;
};

int dir[4][2] = { {0, 1}, {1, 0}, {0, -1}, { -1, 0} };

bool isOk(int x, int y)
{
	if (x >= 0 && x <= row && y >= 0 && y <= col) {
		return true;
	}
	return false;
}

void bfs(int x, int y)
{
	Point p;
	p.x = x;
	p.y = y;
	p.step = 0;
	memset(visit, false, sizeof(visit));
	queue<Point> q;
	q.push(p);
	visit[x][y] = true;
	int count = 1;
	while (!q.empty()) {
		Point now = q.front();
		q.pop();
		Point next;
		for (int i = 0; i < 4; i++) {
			next.x = now.x + dir[i][0];
			next.y = now.y + dir[i][1];

			if (isOk(next.x, next.y) && map[next.x][next.y] >= 0 && !visit[next.x][next.y]) {
				next.step = now.step + 1;
				visit[next.x][next.y] = true;
				q.push(next);
				if (map[next.x][next.y] > 0) {
					int u = map[x][y];
					int v = map[next.x][next.y];
					dist[u - 1][v - 1] = next.step;
					count ++;
					if (count == n) {
						return ;
					}
				}
			}
		}
	}
}

void prim()
{
	int i, j;
	int sum = 0;
	mark = 0;
	lowcost[0] = -1;
	for (i = 1; i < n; i++) {
		lowcost[i] = dist[0][i];
	}
	for (i = 1; i < n ; i++) {
		int min = INF;
		for (j = 0; j < n; j++) {
			if (lowcost[j] != -1 && lowcost[j] < min) {
				min = lowcost[j];
				mark = j;
			}
		}
		sum += min;
		lowcost[mark] = -1;
		for (j = 0; j < n; j++) {
			if (dist[mark][j] < lowcost[j]) {
				lowcost[j] = dist[mark][j];
			}
		}
	}
	printf("%d\n", sum);
}

int main()
{
	int T;
	int i, j;
	scanf("%d", &T);
	while (T--) {
		n = 0;
		memset(dist, 0, sizeof(dist));
		scanf("%d %d", &col, &row);
		char c = ‘ ‘;
		while (c != ‘\n‘) {
			c = getchar();
		}
		for (i = 0; i < row; i++) {
			for (j = 0; j < col; j++) {
				scanf("%c", &c);
				if (c == ‘S‘ || c == ‘A‘) {
					map[i][j] = ++n;
				} else if (c == ‘#‘) {
					map[i][j] = -1;
				} else if (c == ‘ ‘) {
					map[i][j] = 0;
				}
			}
			getchar();
		}
		for (i = 0; i < row; i++) {
			for (j = 0; j < col; j++) {
				if (map[i][j]) {
					bfs(i, j);
				}
			}
		}
		prim();
	}
	return 0;
}

  

POJ 3026 Borg Maze

标签:

原文地址:http://www.cnblogs.com/subrshk/p/4243210.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!