http://ybt.ssoier.cn:8088/problem_show.php?pid=1191
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char mi[110][110];
int flag[110][110]={0}; //标记数组
int main()
{
int a;//a*a矩阵
cin>>a;
for(int i=1;i<=a;i++)//输入
{
for(int j=1; j<=a; j++)
cin>>mi[i][j];
}
int m;//第m天
cin>>m;
for(int tip=1;tip<=m-1;tip++)//重复m天
{
memset(flag,0,sizeof(flag)); //每天都初始化标记数组
for( int i=1; i<=a; i++)
for( int j=1; j<=a; j++)
{
if(mi[i][j]=='@' && flag[i][j] != 1)//传染一周
{
if(mi[i][j-1] == '.') //某个坐标点的左侧是 行坐标不变,列坐标减1
{
mi[i][j-1] ='@';
flag[i][j-1] = 1; //同时标记一下,防止一天当中多次传染
}
if(mi[i-1][j] == '.') //上
{
mi[i-1][j] ='@';
flag[i-1][j]=1;
}
if(mi[i][j+1] == '.')// 右
{
mi[i][j+1] ='@';
flag[i][j+1]=1;
}
if(mi[i+1][j] == '.')
{
mi[i+1][j] ='@';
flag[i+1][j] =1;
}
}
}
//一天结束了
}
int rs=0;//感染人数
for(int i=1; i<=a; i++)
for(int j=1; j<=a; j++)
if(mi[i][j]=='@')
{
rs++;
}
cout<<rs;
return 0;
}
/*
第一天:
....#
.#.@.
.#@..
#....
.....
第二天:
...@#
.#@@@
.#@@.
#.@..
.....
第三天
..@@#
.#@@@
.#@@@
#@@@.
..@..
第四天:
.@@@#
.#@@@
.#@@@
#@@@@
.@@@.
第五天
@@@@#
.#@@@
.#@@@
#@@@@
@@@@@
*/