编程题#6:流感传染
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
输入
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.
输出
输出第m天,得流感的人数
样例输入
5 ....# .#.@. .#@.. #.... ..... 4
样例输出
16
//
// main.cpp
// test
//
// Created by SpyThree on 16/9/16.
// Copyright © 2016年 SpyThree. All rights reserved.
//
#include <iostream>
#include <iomanip>
using namespace std;
int n;
int m;
char matrix[10000][10000];
char temp[10000][10000];
void get_Infected(int i, int j);
bool occupied_OrNot(int i, int j);
int count();
int main (){
cin >> n;
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n; j ++) {
cin >> matrix[i][j];
}
}
cin >> m;
for (int t = 0; t < m - 1; t ++) {
for (int i = 0; i < 10000; i ++) {
for (int j = 0; j < 10000; j ++) {
temp[i][j] = matrix[i][j];
}
}
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n; j ++) {
if (matrix[i][j] == '@') {
get_Infected(i, j);
}
}
}
for (int i = 0; i < 10000; i ++) {
for (int j = 0; j < 10000; j ++) {
matrix[i][j] = temp[i][j];
}
}
}
cout << count() <<endl;
return 0;
}
void get_Infected(int i, int j){
if (i == 0 && j == 0) {
if (occupied_OrNot(1, 0) == true) {
temp[1][0] = '@';
}
if (occupied_OrNot(0, 1) == true) {
temp[0][1] = '@';
}
}
if (i == 0 && j != 0 && j != n - 1) {
if (occupied_OrNot(0, j - 1) == true) {
temp[0][j - 1] = '@';
}
if (occupied_OrNot(0, j + 1) == true) {
temp[0][j + 1] = '@';
}
}
if (i == 0 && j == n - 1) {
if (occupied_OrNot(0, n - 2) == true) {
temp[0][n - 2] = '@';
}
if (occupied_OrNot(1, n - 1) == true) {
temp[1][n - 1] = '@';
}
}
if (i != 0 && j == n - 1 && i != n - 1) {
if (occupied_OrNot(i, n - 1) == true) {
temp[i][n - 1] = '@';
}
if (occupied_OrNot(i, n + 1) == true) {
temp[i][n + 1] = '@';
}
}
if (i == n - 1 && j == n - 1) {
if (occupied_OrNot(n - 1, n - 2) == true) {
temp[n - 1][n - 2] = '@';
}
if (occupied_OrNot(n - 2, n - 1) == true) {
temp[n - 2][n - 1] = '@';
}
}
if (j != 0 && j != n - 1 && i == n - 1) {
if (occupied_OrNot(n - 1, j + 1) == true) {
temp[n - 1][j + 1] = '@';
}
if (occupied_OrNot(n - 1, j - 1) == true) {
temp[n - 1][j - 1] = '@';
}
}
if (i == n - 1 && j == 0) {
if (occupied_OrNot(n - 1, 1) == true) {
temp[n - 1][1] = '@';
}
if (occupied_OrNot(n - 2, 0) == true) {
temp[n - 2][0] = '@';
}
}
if (i != 0 && i != n - 1 && j == 0) {
if (occupied_OrNot(i - 1, 0) == true) {
temp[i - 1][0] = '@';
}
if (occupied_OrNot(n - 1, j - 1) == true) {
temp[i + 1][0] = '@';
}
}
if (i != 0 && i != n - 1 && j != 0 && j != n - 1) {
if (occupied_OrNot(i - 1, j) == true) {
temp[i - 1][j] = '@';
}
if (occupied_OrNot(i + 1, j) == true) {
temp[i + 1][j] = '@';
}
if (occupied_OrNot(i, j + 1) == true) {
temp[i][j + 1] = '@';
}
if (occupied_OrNot(i, j - 1) == true) {
temp[i][j - 1] = '@';
}
}
}
bool occupied_OrNot(int i, int j){
if (matrix[i][j] != '#') {
return true;
}else{
return false;
}
}
int count(){
int result = 0;
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n; j ++) {
if (matrix[i][j] == '@') {
result = result + 1;
}
}
}
return result;
}
这一题思路还算比较明确吧,但是写起来很麻烦,我觉得这几句代码挺有用的,在做声音、流感传播的时候非常有用,需要mark一下