が、私は自分自身でそれを実装するためにライフゲームを研究し、そしてルールを次の実装に出くわしたんだ:Java:ConwayのGame of Lifeを実装する方法は?
n個の細胞によってメートルでボードを考えると、各セルは、ライブの初期状態を持っています(1)または死んだ(0)。下に起因するかのように
- 少ない2人のつよりライブ隣人を持つ任意の生細胞は、死ぬ:各セルは(Wikipediaの記事上方から見た)以下の4つの規則を使用して、その8つの近傍(水平、垂直、対角)と相互作用します-人口。
- 2つまたは3つのライブネイバーが存在するライブセルは、次世代に存在します。
- 過剰集団の場合のように、3つ以上のライブネイバーが存在するライブセルが死ぬ。
- 正確に3つのライブネイバーを持つ死んだセルは、まるで再生によって生きているセルになります。
と実装(https://discuss.leetcode.com/topic/29054/easiest-java-solution-with-explanation):
public void gameOfLife(int[][] board) {
if (board == null || board.length == 0) return;
int m = board.length, n = board[0].length;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int lives = liveNeighbors(board, m, n, i, j);
// In the beginning, every 2nd bit is 0;
// So we only need to care about when will the 2nd bit become 1.
if (board[i][j] == 1 && lives >= 2 && lives <= 3) {
board[i][j] = 3; // Make the 2nd bit 1: 01 ---> 11
}
if (board[i][j] == 0 && lives == 3) {
board[i][j] = 2; // Make the 2nd bit 1: 00 ---> 10
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
board[i][j] >>= 1; // Get the 2nd state.
}
}
}
public int liveNeighbors(int[][] board, int m, int n, int i, int j) {
int lives = 0;
for (int x = Math.max(i - 1, 0); x <= Math.min(i + 1, m - 1); x++) {
for (int y = Math.max(j - 1, 0); y <= Math.min(j + 1, n - 1); y++) {
lives += board[x][y] & 1;
}
}
lives -= board[i][j] & 1;
return lives;
}
とドライバ:
public static void main(String args[]) {
GameOfLife gl = new GameOfLife();
int[][] board = {
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
};
gl.gameOfLife(board);
}
そして、私の質問、liveNeighbors()
でx
とy
は何を表しているんですか?なぜMath.min()
とMath.max()
の必要性が理解できないのですか?また、lives
はボード上の初期化された生活の量を表していますか?
説明を誤解している可能性があります。解答を受け入れる前に、各反復で何が起こっているのかをコメントできますか?本当に物事をクリアするのに役立ちますか? –
ありがとうございます。それは多くのことをクリアしました!ちょっとだけ質問があります。私はまだ命= board [i] [j]&1'部分を取得しません。私たちの広場には1つもありませんでしたか? '(1,2)? 1を引いた理由は何ですか?編集:ああ、それは私たちが周りの正方形を見つけているポイントそのものです、そしてそれが1ならば、1を引いて、正しい? –
また、 'board [i] [j] >> = 1'の' board [x] [y]&1'と>> = 1の&1はどうしますか? –