病毒扩散(详细题解)

病毒扩散

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 29  Solved: 10
[ Submit][ Status][ Web Board]

Description

在一个 N * M 的方格中,有一些位置是病毒所在位置,每一秒钟,每一个病毒都会向四个方向同时扩散,扩散出去的病毒还会以相同的方式继续扩散....好可怕啊,那么最少几秒钟病毒源就可以将整个方格都扩散? 

Input

题目数据有多组,请读入至文件结束。

每组有两个正整数N,M(1<=N,M<=100)。代表该区域格阵的行、列数。

之后有N行,每行M个字符,作为区域的描述。其中'.'代表该点为空,'x'代表该点有病毒存在。

Output

输出一个整数,即病毒占满整个区域时所需要的时间。若一直无法占满,则输出"-1"。每组输出占一行。

Sample Input

3 4..x........x

Sample Output

3

HINT

Source



# include <iostream>
# include <queue>


using namespace std;

//建立一个结构体把病毒的坐标和第几次产生标记
struct node
{
int x, y;
int time;
};


queue<struct node> q;
char mm[105][105];
int n, m;
int t = 0;
int dir[][2] = {0, 1, 0, -1, 1, 0, -1, 0};
void bfs()
{

struct node temp, flag;

//当我的队列为空的时候停止

while(!q.empty())

{

把我队列的第一个取出来并且出队然后判断

temp = q.front();
flag = temp;

q.pop();

//如果我的步数小于当前步数更新状态

if(t < temp.time)
{
t = temp.time;

}

//四个方向的比较

//temp是前一步,flag是走完的一步注意flag的时间是temp + 1

for(int i = 0; i < 4; i++)
{
int tx = temp.x + dir[i][0];
        int ty = temp.y + dir[i][1];
        if(tx < 0 || tx >=n || ty < 0 || ty >= m ||


mm[tx][ty] == '*')
            continue;
flag.x = tx;
flag.y = ty;
        flag.time = temp.time + 1;

        q.push(flag);

//走完之后记得标记防止重复走

        mm[tx][ty] = '*';
}
}
}


int main(int argc,  char *argv[])
{


while(cin >> n >> m)
{
int flag = 0;
t = 0;
for(int i = 0; i < n; i++)
{
cin >> mm[i];
}
struct node temp;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)

{

//找病毒位置并且入队

if(mm[i][j] == 'x')
{
flag = 1;


temp.x = i;
temp.y = j;
temp.time = 0;
q.push(temp);
mm[i][j] = '*';
}
}
}
bfs();
if(flag)
{
cout << t << endl;
}
else
{
cout << -1 << endl;
}
}


return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值