pta 感染,结构体队列的使用

新冠疫情爆发,Drizzle 想知道假如在一个区域内分布着正常人和感染者,感染者每天会感染附近(上下左右)的正常人,多少天内所有人都被感染,求出最少天数days,如果不会被全部感染则输出victory

要求:

输入:第一行输入两个整数m,n表示地图区域的行列,随后的m行输入n个数字表示地图中的人员布局(0表示没人,1表示正常人,2表示感染者)。
输出:假如所有人被感染输出全部人员都被感染的天数num,否则输出victory

输入:

3 3
2 1 1
1 1 0
0 1 1

输出:

4

另一道类似于本题的链接:pta 7-8 印度大壶节 (25 分)_菜菜记笔记的博客-CSDN博客 

(可以同时参考借鉴哦)

代码如下:(思路注释中给出)

#include<bits/stdc++.h>
using namespace std;
typedef struct nnn {
	int x, y;
}s;
s D;
queue<s>a;//结构体队列,存储为访问过的感染者
int m, n, sum = 0;
bool flag = true;
int arr[100][100];
int ss[4] = { -1,1,0,0 };
int bb[4] = { 0,0,-1,1 };
void Find(int x, int y) {
	//上下左右查找是否未被感染,为被感染则直接感染
	for (int i = 0; i < 4; i++) {
		if (x >= m || x < 0 || y >= n || y < 0)continue;
		if (arr[x + ss[i]][y + bb[i]] == 1) {
			arr[x + ss[i]][y + bb[i]] = 2;
			D.x = x + ss[i]; D.y = y + bb[i];
			a.push(D);
			sum--;
			flag = false;
		}
	}
}

int main() {
	cin >> m >> n;
	int day = 0, t;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			cin >> t; arr[i][j] = t;
			if (t == 1)sum++;//记录为被感染人数
			if (t == 2) {//结构体队列的存储
				D.x = i;
				D.y = j;
				a.push(D);
			}
		}
	}
	while (1) {//一轮一轮查找,一轮一轮感染,直到无未感染着或无法再继续感染
		flag = true;
		int lens = a.size();
		for (int i = 0; i < lens; i++) {
			D = a.front();//结构体队列的访问
			int x = D.x, y = D.y;
			Find(x, y);
			a.pop();//结构体队列的删除(出队)
		}

		if (flag && sum != 0) {//如果无法再继续感染且还有幸存者则胜利
			cout << "victory"; return 0;
		}
		day++;
		if (sum == 0) {//全被感染,则输出天数(轮回的次数)
			cout << day; return 0;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值