大家好,表示欢迎。 对有兴趣前来讨论的新手老手表示感谢。
为了开发 app,刚开始学 2 天 java,于是就想写一个细胞自动机实践一下:
先说规则。细胞自动机是某某数学家发明,也叫 “生命游戏” (game of life),是一个特别能令人感兴趣的有趣算法!
具体规则是,一个二位矩阵(比如围棋棋盘),每个方格都是一个细胞,或者死,或者活。每个细胞的下一个状态,取决于它周围的八个细胞的当前状态。 对于一个活细胞,如果它周围的活细胞 = 2 or 3,那么它继续活,否则死。 对于一个死细胞,如果它周围的活细胞 = 3,那么它复活,否则继续死。
于是编程思路就来了。首先我建 x、y 两个数组,每个数组都代表一个 11 x 9 的矩阵 用循环来计算每个 x,然后赋值到 y,并输出 y 再用下一个循环来计算每个 y,然后赋值到 x,并输出 x。
多么无懈可击的一个思路!!! 然而到第二个循环就出错了,矩阵里莫名其妙多了两个活细胞!! 我设置的初始状态,是一个这样的形状:( 1 为活,0 为死)
00000000000
00000000000
00110001100
00101010100
00101010100
00001010000
00011011000
00011011000
00000000000
这个形状是 “ Tumbler ” 细胞循环中的一个状态,全部状态可以在这个在线玩生命游戏的网站测试: (见 1 楼) 网站里面可以选择 “ Tumbler ” 形状的预设。
我的程序,第一个计算结果是对的:
00000000000
00000000000
00110001100
01101010110
00001010000
00001010000
00000000000
00011011000
00000000000
但第二个开始,就有错误了:
00000000000
00000000000
01110001110
01101010110
00101010100 这行多出两个 1 ???
00000000000
00011011000
00000000000
00000000000
原因不明。根本就不知道什么什么情况,因为算法明明很简单! 源码如下,欢迎拿去品尝: (见 1 楼)
加油。好运。感谢。
1
harley27 OP 这是我的代码:shared 点 微云拼音 点 康姆 /5UlK45D
|
2
harley27 OP 在线玩生命游戏的网址 在必应国际版搜 game of life 第一个就是
我已经放弃发网址了 |
3
harley27 OP 抱歉,关于生命游戏,请自行百科,我发不了网址。
|
4
w274189159 2019-07-17 16:32:50 +08:00 1
|
5
harley27 OP 这是我的代码:share 点 微云拼音 点 康姆 /5UlK45D
上面的发错了。 |
6
harley27 OP @w274189159 谢谢你,就是这个
很期待什么时候我的账号功能完善后能和大家正常讨论 |
7
q4336431 2019-07-17 16:52:42 +08:00
之前帮别人写过,数组版的跟链表版的,数组版的代码应该还在,你需要么- -
|
8
actar 2019-07-17 16:56:21 +08:00 1
https://github.com/actar233/Conway_Game_of_Life/
这是我之前自己写的,有兴趣的可以参考一下,希望能对你有帮助。 |
10
newtype0092 2019-07-17 18:04:29 +08:00
第一个结果是对的么?
第三行有两个连着的 1,那第二行这两个 1 上面肯定也是 1 啊,明显算错了吧。 我算的第一轮后的结果: 00000000000 00110001100 01111111110 01101010110 01001010010 00101010100 00100000100 00111011100 00011111000 |
11
q4336431 2019-07-18 09:16:55 +08:00 1
|
12
harley27 OP |
13
shawnyin 2019-07-18 13:53:07 +08:00
```java
class Solution { public void gameOfLife(int[][] board) { //use -1 to indicate the cell lives but die at this generation //use 2 to indicate the cell dies but live at this generation int[][] shift = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 }, { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } }; int m = board.length; int n = board[0].length; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { int cnt_live = 0; for (int k = 0; k < 8; k++) { int x = i + shift[k][0]; int y = j + shift[k][1]; if (x >= 0 && y >= 0 && x < m && y < n && Math.abs(board[x][y]) == 1) { cnt_live++; } } if (board[i][j] == 0 && cnt_live == 3) board[i][j] = 2; if (board[i][j] == 1 && (cnt_live > 3 || cnt_live < 2)) { board[i][j] = -1; } } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (board[i][j] == -1) board[i][j] = 0; if (board[i][j] == 2) board[i][j] = 1; } } return; } } ``` |