Biotech_模拟

来源:互联网 发布:java如何发送短信 编辑:程序博客网 时间:2024/06/05 02:42

题目描述

Bob 发现了一群有趣的细胞。
这群细胞排列成一个n  m 的矩阵。每个细胞有两个状态:放电状态和平静
状态。它们每秒钟都会按以下的规则转换状态:
首先我们定义,一个细胞的邻居为它周围的8 个细胞。同时设k 为某一个细
胞的处于放电状态的邻居的个数。
若k < 2,则这个细胞在下一秒因电量不足而变为/保持平静状态。
若k = 2,则这个细胞在下一秒保持原来的状态。
若k = 3,则这个细胞在下一秒因得到充足的电量而变为/保持放电状态。
若k > 3,则这个细胞在下一秒因过载而变为/保持平静状态。
Bob 观察了这些细胞现在所处于的状态。他想预测t 秒后这些细胞的状态。


思路

题目数据只有100,就是说O(n^3)都不会爆
所以直接上暴力就可以了
这里采用了一种神奇的方法解决数组互换的问题,跑得飞快


#include <stdio.h>#include <string>#define maxn 102using 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");    }}
原创粉丝点击