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
题解:从@点扩展,优先扩展话费更小的那条路,最后得到的就是最小的价值,使用优先队列维护,跑一波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;
}