CSU 1726(BFS)

1726: 你经历过绝望吗?两次!

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 163   Solved: 42
[ Submit][ Status][ Web Board]

Description

4月16日,日本熊本地区强震后,受灾严重的阿苏市一养猪场倒塌,幸运的是,猪圈里很多头猪依然坚强存活。当地15名消防员耗时一天解救围困的“猪坚强”。不过与在废墟中靠吃木炭饮雨水存活36天的中国汶川“猪坚强”相比,熊本的猪可没那么幸运,因为它们最终还是没能逃过被送往屠宰场的命运。
我们假设“猪坚强”被困在一个N*M的废墟中,其中“@”表示“猪坚强”的位置,“.”表示可以直接通过的空地,“#”表示不能拆毁的障碍物,“*”表示可以拆毁的障碍物,那么请问消防员至少要拆毁多少个障碍物,才能从废墟中救出“猪坚强”送往屠宰场?(当“猪坚强”通过空地或被拆毁的障碍物移动到废墟边缘时,视作被救出废墟)

Input

多组数据,第一行有一个整数T,表示有T组数据。(T<=100)
以下每组数据第一行有两个整数N和M。(1<=N,M<=100)
接着N行,每行有一个长度为M的字符串。

Output

一个整数,为最少拆毁的障碍物数量,如果不能逃离废墟,输出-1。

Sample Input

3
3 3
###
#@*
***
3 4
####
#@.*
**.*
3 3
.#.
#@#
.#.

Sample Output

1
0
-1

HINT

Source

LVV



题解:从@点扩展,优先扩展话费更小的那条路,最后得到的就是最小的价值,使用优先队列维护,跑一波BFS





#include<cstdio>  
#include<cstring>  
#include<cstdlib>  
#include<cmath>  
#include<iostream>  
#include<algorithm>  
#include<vector>  
#include<map>  
#include<set>  
#include<queue>  
#include<string>  
#include<bitset>  
#include<utility>  
#include<functional>  
#include<iomanip>  
#include<sstream>  
#include<ctime>  
using namespace std;

#define N int(1e3+10)  
#define inf int(0x3f3f3f3f)  
#define mod int(1e9+7)  
typedef long long LL;


int vx[] = { 0, 0, -1, 1 };
int vy[] = { 1, -1, 0, 0 };

char s[N][N];
int vis[N][N];
int t, n, m;

bool judge(int x, int y)
{
	return x >= 0 && x<n&&y >= 0 && y<m;
}

int  bfs(int x, int y)
{
	int ans = inf;
	memset(vis, 0, sizeof(vis));
	vis[x][y] = 1;
	priority_queue<  pair<int, pair<int, int> >, vector<pair<int, pair<int, int> > >, greater<pair<int, pair<int, int> > > >q;
	pair<int, pair<int, int> > top, temp;
	q.push(make_pair(0, make_pair(x, y)));
	while (!q.empty())
	{
		top = q.top(); q.pop();
		for (int i = 0; i<4; i++)
		{
			int tx = top.second.first + vx[i];
			int ty = top.second.second + vy[i];
			int cot = top.first;
			if (!judge(tx, ty))
			{
				return top.first;
			}
			if (s[tx][ty] == '#' || vis[tx][ty])
			{
				continue;
			}
			if (s[tx][ty] == '.'&&!vis[tx][ty])
			{
				vis[tx][ty] = 1;
				q.push(make_pair(cot, make_pair(tx, ty)));
			}
			if (s[tx][ty] == '*'&&!vis[tx][ty])
			{
				vis[tx][ty] = 1;
				q.push(make_pair(cot + 1, make_pair(tx, ty)));
			}
		}
	}
	return -1;
}

int main()
{
#ifdef CDZSC  
	freopen("i.txt", "r", stdin);
	//freopen("o.txt","w",stdout);  
	int _time_jc = clock();
#endif  
	scanf("%d", &t);
	while (t--)
	{
		int sx, sy;
		scanf("%d%d", &n, &m);
		for (int i = 0; i<n; i++)
			scanf("%s", s[i]);
		for (int i = 0; i<n; i++)
		{
			for (int j = 0; j<m; j++)
			{
				if (s[i][j] == '@')
				{
					sx = i; sy = j;
				}
			}
		}
		printf("%d\n", bfs(sx, sy));
	}
	return 0;
}









你可能感兴趣的:(CSU 1726(BFS))