1. 程式人生 > >Coursera 學習記錄:流感傳染(關於二維陣列的標記和統計)

Coursera 學習記錄:流感傳染(關於二維陣列的標記和統計)

描述

有一批易感人群住在網格狀的宿舍區內,宿舍區為n*n的矩陣,每個格點為一個房間,房間裡可能住人,也可能空著。 在第一天,有些房間裡的人得了流感,以後每天,得流感的人會使其鄰居傳染上流感,(已經得病的不變),空房間不會傳染。請輸出第m天得流感的人數。

輸入

第一行一個數字n,n不超過100,表示有n*n的宿舍房間。 接下來的n行,每行n個字元,’.’表示第一天該房間住著健康的人,’#’表示該房間空著,’@’表示第一天該房間住著得流感的人。 接下來的一行是一個整數m,m不超過100.

輸出

輸出第m天,得流感的人數

樣例
輸入
5
....#
.#[email protected]
.#@.. #.... ..... 4 輸出 16

解題思路

通過陣列進行統計,但根據題目要求,標記的記錄和統計並非即可生效

#include<iostream>
using namespace std;

int main() {
	char m[100][100];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> m[i][j];
		}
	}
	int day;
	cin >> day;
	int count = 0;
	/*
	// 網狀格子,感染髮生於上下左右四個位置
	// 四個位置的表示:[a-1][b],[a+1][b],[a][b-1],[a][b+1]
	// 並且感染過之後就為感染源
	for (int i = 0; i < day; i++) {
		for (int a = 0; a < n; a++) {
			for (int b = 0; b < n; b++) {
				if (m[a][b] == '@') {
					if ((a - 1) >= 0 && m[a - 1][b] == '.') {
						m[a - 1][b] = '@';
						count++;
					}
					if ((a + 1) < n && m[a + 1][b] == '.') {
						m[a + 1][b] = '@';
						count++;
					}
					if ((b - 1) >= 0 && m[a][b - 1] == '.') {
						m[a][b - 1] = '@';
						count++;
					}
					if ((b + 1) < n && m[a][b + 1] == '.') {
						m[a][b + 1] = '@';
						count++;
					}
				}

			}
		}
	
	}
	// 這種演算法,思路的方向是對的,但是運算起來有問題
	// 因為傳染成功併成為心得感染源是在第一天,
	// 這個演算法就使得當天成為新感染源,所以有問題
	// 可以考慮在第一天加一個感染標記,在第二天統一重新整理成感染的
	*/

	for (int i = 0; i < day; i++) {
		//將有感染標記變成感染的,第一天沒有。
		for (int a = 0;  a < n; a++) {
			for (int b = 0; b < n; b++) {
				if (m[a][b] == '!') {
					m[a][b] = '@';
				}
			}
		}

		//標記在當天被感染的
		for (int a = 0; a < n; a++) {
			for (int b = 0; b < n; b++) {
				if (m[a][b] == '@') {
					if ((a - 1) >= 0 && m[a - 1][b] == '.') {
						m[a - 1][b] = '!';
					}
					if ((a + 1) < n && m[a + 1][b] == '.') {
						m[a + 1][b] = '!';
					}
					if ((b - 1) >= 0 && m[a][b - 1] == '.') {
						m[a][b - 1] = '!';
					}
					if ((b + 1) < n && m[a][b + 1] == '.') {
						m[a][b + 1] = '!';
					}
				}

			}
		}

	}
	//在最後記錄所有被感染的
	for (int a = 0; a < n; a++) {
		for (int b = 0; b < n; b++) {
			if (m[a][b] == '@') {
				count++;
			}
		}
	}
	
	cout << count << endl;
	return 0;

}