Description
2019-ncov的突然出现扰乱了人们的日常生活,它具有极强的传染性,可以快速的在人群中扩散,现在研究人员正在模拟其在人群中的扩散情况.
在一个n*m矩阵所示的人群中,*为普通人,#为佩戴口罩的人,@为病毒携带者,已知每秒每位病毒携带者会将病毒传染给相邻八个方向的未戴口罩的普通人。请问 x 秒后会有多少名传染者(初始为第0秒)?
Input
第一行输入空格分隔的三个数n,m,x代表n行,m列的空间,x秒(n,m<=1000)。
接下来n行每行m人如上述所示。
Output
一个数字,代表最终被传染的人数。
Sample
Input
4 4 2
****
*@**
**##
**#*
Output
12
答案:
思路:因为数据量比较小,所以八个方向直接暴力,注意计数的方式
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
const int N = 1111;
using namespace std;
char mp[N][N]; //存点
int dp[N][N]; //标记数组
int main()
{
ios::sync_with_stdio(0);
int n,m,x;
cin>>n>>m>>x;
int i,j;
int cnt=0;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
cin>>mp[i][j];
if(mp[i][j]=='@')
cnt++;
}
}
int pos=0;
while(x--)
{
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
if(mp[i][j]=='@'&&dp[i][j]==pos)
{
if(mp[i-1][j]=='*') //上
{
mp[i-1][j]='@';
dp[i-1][j]=pos+1;
cnt++;
}
if(mp[i+1][j]=='*') //下
{
mp[i+1][j]='@';
dp[i+1][j]=pos+1;
cnt++;
}
if(mp[i][j-1]=='*') //左
{
mp[i][j-1]='@';
dp[i][j-1]=pos+1;
cnt++;
}
if(mp[i][j+1]=='*') //右
{
mp[i][j+1]='@';
dp[i][j+1]=pos+1;
cnt++;
}
if(mp[i-1][j-1]=='*') //左上
{
mp[i-1][j-1]='@';
dp[i-1][j-1]=pos+1;
cnt++;
}
if(mp[i-1][j+1]=='*') //右上
{
mp[i-1][j+1]='@';
dp[i-1][j+1]=pos+1;
cnt++;
}
if(mp[i+1][j-1]=='*') //左下
{
mp[i+1][j-1]='@';
dp[i+1][j-1]=pos+1;
cnt++;
}
if(mp[i+1][j+1]=='*') //右下
{
mp[i+1][j+1]='@';
dp[i+1][j+1]=pos+1;
cnt++;
}
}
}
}
pos++;
}
cout<<cnt<<endl;
return 0;
}