[LeetCode] Game of Life

简介: A solution using additional spaces to solve a copy of the original board is easy. To get an in-place solution, we need to record the information of state transitions directly in the board.

A solution using additional spaces to solve a copy of the original board is easy. To get an in-place solution, we need to record the information of state transitions directly in the board.

We record the state transitions as follows:

// States:
//  0 : dead to dead
//  1 : live to live
//  2 : live to dead
//  3 : dead to live

The code is as follows.

 1 class Solution {
 2 public:
 3     void gameOfLife(vector<vector<int>>& board) {
 4         int m = board.size(), n = m ? board[0].size() : 0;
 5         int di[8] = {-1, -1, -1,  0, 0,  1, 1, 1};
 6         int dj[8] = {-1,  0,  1, -1, 1, -1, 0, 1};
 7         for (int i = 0; i < m; i++) {
 8             for (int j = 0; j < n; j++) {
 9                 int live = 0;
10                 for (int k = 0; k < 8; k++) {
11                     int ii = i + di[k], jj = j + dj[k];
12                     if (ii < 0 || ii >= m || jj < 0 || jj >= n) continue;
13                     if (board[ii][jj] == 1 || board[ii][jj] == 2) live++;
14                 }
15                 if (board[i][j] == 1 && (live < 2 || live > 3)) board[i][j] = 2;
16                 else if (!board[i][j] && live == 3) board[i][j] = 3;
17             }
18         }
19         for (int i = 0; i < m; i++)
20             for (int j = 0; j < n; j++)
21                 board[i][j] %= 2;
22     }
23 };

Wanna a shorter one? Stefan always does so :-) 

目录
相关文章
LeetCode 390. Elimination Game
给定一个从1 到 n 排序的整数列表。 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾。 第二步,在剩下的数字中,从右到左,从倒数第一个数字开始,每隔一个数字进行删除,直到列表开头。 我们不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。 返回长度为 n 的列表中,最后剩下的数字。
101 0
LeetCode 390. Elimination Game
LeetCode 292. Nim Game
你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。 你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。
73 0
LeetCode 292. Nim Game
|
存储 算法
LeetCode 289. Game of Life
如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡; 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活; 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡; 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
75 0
LeetCode 289. Game of Life
|
算法 索引
LeetCode 55. Jump Game
给定一个非负整数数组,您最初定位在数组的第一个索引处。 数组中的每个元素表示该位置的最大跳转长度。 确定您是否能够到达最后一个索引。
89 0
LeetCode 55. Jump Game
|
算法 索引
LeetCode 45. Jump Game II
给定一个非负整数数组,初始位置在索引为0的位置,数组中的每个元素表示该位置的能够跳转的最大部署。目标是以最小跳跃次数到达最后一个位置(索引)。
77 0
LeetCode 45. Jump Game II
LeetCode contest 200 5476. 找出数组游戏的赢家 Find the Winner of an Array Game
LeetCode contest 200 5476. 找出数组游戏的赢家 Find the Winner of an Array Game
|
决策智能
LeetCode之Nim Game
LeetCode之Nim Game
120 0