【题目描述】
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
【输入】
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100。
【输出】
输出第m天,得流感的人数。
【输入样例】
5
....#
.#.@.
.#@..
#....
.....
4
【输出样例】
16
解题思路:
这道题分类在递推里面,但是我找半天,直接暴力出来了...
AC代码:
#include<iostream>
using namespace std;
struct node{
char c;
int flag = 0;
}a[110][110];
struct point{
int x, y;
}p[4] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int main(){
int n, m, cnt = 0, cnt1 = 0;
cin >> n;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
cin >> a[i][j].c;
if(a[i][j].c == '@') a[i][j].flag = 1;
}
}
cin >> m;
m--;
while(m--){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(a[i][j].c == '@' && a[i][j].flag){
for(int k = 0; k < 4; k++){
if(a[i + p[k].x][j + p[k].y].c == '#') continue;
a[i + p[k].x][j + p[k].y].c = '@';
}
}
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(a[i][j].c == '@' && !a[i][j].flag){
a[i][j].flag = 1;
}
}
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j<= n; j++){
if(a[i][j].c == '@') cnt++;
}
}
cout << cnt << endl;
return 0;
}
注意点:
- 对于每一个点,设置一个flag变量,往后好判断;