细胞自动机(思博+模拟)

题目描述:
细胞自动制造公司最近刚刚获得批量生产零件的新工艺专利。它的方法使
用到包含两种细胞状态的二维网格,每个单元的细胞要么为空,要么为满。当然,
具体的细节是专有的。
最初,网格中的一组单元被填充为需要复制的细胞副本。进过一系列离散的步
骤,网格中的每个单元会根据自身及附近的八个单元的状态同步进行细胞状态更
新。如果这九个单元中有奇数个位置的细胞是满的,那么这个单元的下一个状态
也是满的,否则会是空的。
然而,一个 bug 已经蛰伏在工艺中了。在每次更新单元状态之后,网格中某一
个单元的状态可能自动变化。其中一个细胞在第一次状态更新后出现了自动变化,
另一个细胞在第三次状态更新后出现了自动变化。
很不幸,最初的细胞模式丢失了,只有 (可能受到 bug 影响的) 复制结果保留
了下来。你能否编个程序确定可能的最小的非空的初始细胞模式来产生给定的最
终模式呢?
输入描述:
第一行包含两个整数 w(1≤w≤300)和 h(1≤h≤300),其中 w 和 h 表示最终模式
的边框宽度与高度。接下来 h 行,每行包含 w 个字符,描述了最终的模式。每个字
符要么是’.’(表示该单元为空),要么是’#’(表示该单元为满) 。
保证在第一行、最后一行、第一列、最后一列均存在至少一个单元是满的。
输出描述:
输出最小的非空的可能产生最终模式的初始模式,这里假设每个阶段至多会有一个单元状态自动变化。模式的大小取决于边框内的区域。如果由多种可能的
最小的非空的初始模式,那么任意一种答案都是可接受的。请你使用字符’.‘表示空
的单元,使用’#'表示满的单元。请你用必须要使用的最小行数和列数来输出这个
模式。
样例输入:
10 10
.#…#…#
##…##…##
##.#.##…
##.#.##…
.#…#####
…##…#.#
…###.
##.#.##…
#…#…#…#
##…##…##
样例输出:
.#

提示:
这里的最小模式指的是最简模式。
比如 # 是最简
而 ### 不是

出题人太菜,写不出 spj,所以数据理论上只有唯一答案,如果出锅,出题人将
手动评测。
有 10%的数据 w,h<=3
有 20%的数据 w,h<=10
另有 10%的数据没有 BUG
有 100%的数据 w,h<=300

题解:来自SZP大佬
首先考虑每次操作后,无论是否有 bug, 被染色的部分都会向四周扩张一格。
所以操作次数是 O(n)的。
如果没有 Bug,我们可以从左上到右下推出之前的版本,即
X [ i ] [ j ] = Y [ i − 1 ] [ j − 1 ] x o r X [ i − 2 ] [ j − 2 ] x o r X [ i − 2 ] [ j − 1 ] x o r X [ i − 2 ] [ j ] x o r X [ i − 1 ] [ j − 2 ] x o r X [ i − 1 ] [ j − 1 ] x o r X [ i − 1 ] [ j ] x o r X [ i ] [ j − 2 ] x o r X [ i ] [ j − 1 ] X[i][j]=Y[i-1][j-1] xor X[i-2][j-2]xorX[i-2][j-1]xorX[i-2][j]xorX[i-1][j-2]xorX[i-1][j-1]xorX[i-1][j]xorX[i][j-2]xorX[i][j-1] X[i][j]=Y[i1][j1]xorX[i2][j2]xorX[i2][j1]xorX[i2][j]xorX[i1][j2]xorX[i1][j1]xorX[i1][j]xorX[i][j2]xorX[i][j1]
如果有 Bug,我们考虑点(i,j)Bug 的影响,他会影响下一行的(i+1,j)(i+1,j+1)…(i+1,j+3k)(i+1,j+3k+1)
那么对于(i+1,w+1)和(i+1,w+2)如果存在 1,那么第 i 行必然存在 Bug,然后我们先列后行再做一遍找出
Bug 所在列,把 Bug 取反后继续做。
如果现在的行列或长度等于 1,则可以停止,如果在清除完一个错误后继续检查还会出现错误,
则已经到了最简形式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值