题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1191
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 7424 通过数: 4017
【题目描述】
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
【输入】
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100。
【输出】
输出第m天,得流感的人数。
【输入样例】
5
…#
.#.@.
.#@…
#…
…
4
【输出样例】
16
【来源】
No
思路:数字d表示第d天被传染得病( 1 ≤ d ≤ m 1\leq d\leq m 1≤d≤m),0表示健康,-1表示空房间。
#include <bits/stdc++.h>
using namespace std;
int n,m;
int step[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int a[105][105];
int main(){
scanf("%d",&n);
int ans=0;
char ch;
for(int i=0;i<n;i++ ){
for(int j=0;j<n;j++){
scanf(" %c",&ch);
if(ch=='@'){
a[i][j]=1;
ans++;
}
else if(ch=='.'){
a[i][j]=0;
}
else{
a[i][j]=-1;
}
}
getchar();
}
scanf("%d",&m);
for(int d=1;d<m;d++){
for(int i=0;i<n;i++ ){
for(int j=0;j<n;j++){
if(a[i][j]==d){
for(int k=0;k<4;k++){
int tmpx=i+step[k][0];
int tmpy=j+step[k][1];
if(tmpx>=0 && tmpx<n && tmpy>=0 && tmpy<n && a[tmpx][tmpy]==0){
a[tmpx][tmpy]=d+1;
ans++;
}
}
}
}
}
}
printf("%d\n",ans);
// system("pause");
}