Biotech_模拟

lzusa 发布于 2019-05-22 0 次阅读


题目描述

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");
    }

}
]]>