解题思路:
上图数字表示样例第几分钟时的灌溉
题解:
#include <bits/stdc++.h>
using namespace std;
const int N = 120;
bool a[N][N], b[N][N];//两个数组,一个记录当前,一个记录后一分钟
//bool:灌溉为1,反之为0
int main()
{
int n, m;cin >> n >> m;
int t; cin >> t;
for(int i = 1; i <= t; i++)
{
int x,y;cin >> x >> y;
a[x][y] = 1;
}
int k;cin >> k;//k时时间
while(k--)//当时间k为0的时候停止
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
if(a[i][j])b[i][j] = b[i - 1][j] = b[i + 1][j] = b[i][j - 1] = b[i][j + 1] = 1;
//左右上下本身灌溉
}
//确保a为b的前1分钟,保证连续状态,维持while的正常
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)a[i][j] = b[i][j];
}
int ans = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(a[i][j])ans++;
}
}
cout << ans;
return 0;
}
模拟算法