1.题目描述
在一个封闭的房间里,gogo给大家表演了他的屁遁术,人果然一下没影了,但是他留下的“生化武器”,却以每秒1米的速度向上下左右扩散出去。为了知道自己会不会被“毒”到,你果断写了个算法计算出了“毒气”在t秒时间内可以到达的所有地方.
2.输入输出描述
2.1 输入描述
有多组测试数据,第一行输入n,m,t(0<n,m<=30,n和m表示图的行和列,t表示时间 ,‘*’为表演的地点,‘X’是墙,‘.’为空白的地方
2.2 输出描述
如果在t秒时间内毒气没有充满房间或刚好充满,输出现在房间里的情况,‘#’表示有‘毒气’的地方否则,输出“No”,每组数据输出后有一个空行
输入输出样例
输入:
5 5 2
XXXXX
X...X
X.*.X
X...X
XXXXX
输出:
XXXXX
X###X
X###X
X###X
XXXXX
4.题目思路:
常规BFS,不过要设置一个辅助队列,我们以上述的输出例子为例来分析一下,对于时间的判断可以在输入时统计“.”的个数,判断什么时候“.”的个数为0,此时充满整个房间
5.代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=100+5;
char mpt[maxn][maxn];
int vis[maxn][maxn];
int dir[4][2]={0,1,1,0,0,-1,-1,0};
struct node
{
int x,y;
};
int dfs(int sx,int sy,int time,int sum)
{
int t1=-1;
memset(vis,0,sizeof(vis));
queue<node> q,p;
q.push(node{sx,sy});
vis[sx][sy]=1;//屁达到的地方
for(int t=1;t<=time;t++)
{
p=q;//记录这一次还在队列中元素
while(!p.empty())
{
node now=p.front();
p.pop();
q.pop();
for(int i=0;i<4;i++)
{
int nx=now.x+dir[i][0];
int ny=now.y+dir[i][1];
if(mpt[nx][ny]=='.'&&vis[nx][ny]!=1)
{
q.push(node{nx,ny});
vis[nx][ny]=1;
sum--;
if(sum==0) t1=t;
}
}
}
}
return t1;
}
int main()
{
int h,w,time;
while(cin >> h >> w >> time)
{
int sx,sy;
int sum=0;
for (int i = 0; i < h; ++i)
{
cin >> mpt[i];
for (int j = 0; j < w; ++j)
{
if(mpt[i][j]=='*') sx=i,sy=j;
if(mpt[i][j]=='.') sum++;
}
}
int t1=dfs(sx,sy,time,sum);
if(time==t1||t1==-1) //刚好和未充满
{
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
if(vis[i][j]==1)
{
mpt[i][j]='#';
}
cout << mpt[i][j];
}
cout << endl;
}
cout<<endl;
}
else
{
printf("No");
}
}
}
6.题目来源
N诺:1126
http://www.noobdream.com/DreamJudge/Issue/page/1126/