题目描述
Bob 发现了一群有趣的细胞。
这群细胞排列成一个n m 的矩阵。每个细胞有两个状态:放电状态和平静
状态。它们每秒钟都会按以下的规则转换状态:
首先我们定义,一个细胞的邻居为它周围的8 个细胞。同时设k 为某一个细
胞的处于放电状态的邻居的个数。
若k < 2,则这个细胞在下一秒因电量不足而变为/保持平静状态。
若k = 2,则这个细胞在下一秒保持原来的状态。
若k = 3,则这个细胞在下一秒因得到充足的电量而变为/保持放电状态。
若k > 3,则这个细胞在下一秒因过载而变为/保持平静状态。
Bob 观察了这些细胞现在所处于的状态。他想预测t 秒后这些细胞的状态。
思路
题目数据只有100,就是说O(n^3)都不会爆
所以直接上暴力就可以了
这里采用了一种神奇的方法解决数组互换的问题,跑得飞快
#include
#include
#define maxn 102
using namespace std;
int a[maxn][maxn][3];
int chack(int x, int y, int l)
{
int ans = 0;
if (a[x-1][y][l] == 1) ans ++;
if (a[x][y-1][l] == 1) ans ++;
if (a[x-1][y-1][l] == 1) ans ++;
if (a[x+1][y][l] == 1) ans ++;
if (a[x][y+1][l] == 1) ans ++;
if (a[x+1][y+1][l] == 1) ans ++;
if (a[x-1][y+1][l] == 1) ans ++;
if (a[x+1][y-1][l] == 1) ans ++;
return ans;
}
int main()
{
freopen("biotech.in", "r", stdin);
freopen("biotech.out", "w", stdout);
int n, m, t;
scanf("%d%d%d", &n, &m, &t);
t++;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
{
char ch = getchar();
while (ch != '0' && ch != '1') ch = getchar();
if (ch == '1') a[i][j][1] = 1;
}
int x = 2, y = 1;
for (int o = 2; o <= t; o ++)
{
int xx = x;
x = y;
y = xx;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m ;j ++)
{
int k = chack(i, j, x);
if (k < 2 || k > 3) a[i][j][y] = 0;
else if (k == 3) a[i][j][y] = 1;
else if (k == 2) a[i][j][y] = a[i][j][x];
}
}
for (int i = 1; i <= n; i ++)
{
for (int j = 1; j <= m; j ++)
printf("%d", a[i][j][y]);
printf("\n");
}
}
Comments NOTHING