Coursera 學習記錄:流感傳染(關於二維陣列的標記和統計)
阿新 • • 發佈:2018-12-16
描述
有一批易感人群住在網格狀的宿舍區內,宿舍區為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; }