Algobase
  • Introduction
  • Leetcode
    • 226. Invert Binary Tree
    • 136. Single Number
    • 104. Maximum Depth of Binary Tree
    • 344. Reverse String
    • 461. Hamming Distance
    • 617. Merge Two Binary Trees
    • 237. Delete Node in a Linked List
    • 412. Fizz Buzz
    • 206. Reverse Linked List
    • 169. Majority Element
    • 108. Convert Sorted Array to Binary Search Tree
    • 283. Move Zeroes
    • 122. Best Time to Buy and Sell Stock II
    • 242. Valid Anagram
    • 171. Excel Sheet Column Number
    • 217. Contains Duplicate
    • 448. Find All Numbers Disappeared in an Array
    • 13. Roman to Integer
    • 21. Merge Two Sorted Lists
    • 100. Same Tree
    • 121. Best Time to Buy and Sell Stock
    • 350. Intersection of Two Arrays II
    • 268. Missing Number
    • 118. Pascal's Triangle
    • 387. First Unique Character in a String
    • 38. Count and Say
    • 26. Remove Duplicates from Sorted Array
    • 1. Two Sum
    • 53. Maximum Subarray
    • 101. Symmetric Tree
    • 70. Climbing Stairs
    • 543. Diameter of Binary Tree
    • 9. Palindrome Number
    • 191. Number of 1 Bits
    • 202. Happy Number
    • 326. Power of Three
    • 198. House Robber
    • 66. Plus One
    • 724. Find Pivot Index
    • 155. Min Stack
    • 14. Longest Common Prefix
    • 278. First Bad Version
    • 125. Valid Palindrome
    • 172. Factorial Trailing Zeros
    • 20. Valid Parentheses
    • 234. Palindrome Linked List
    • 88. Merge Sorted Array
    • 190. Reverse Bits
    • 160. Intersection of Two Linked Lists
    • 141. Linked List Cycle
    • 189. Rotate Array
    • 28. Implement strStr()
    • 69. Sqrt(x)
    • 204. Count Primes
    • 581. Shortest Unsorted Continuous Subarray
    • 7. Reverse Integer
    • 763. Partition Labels
    • 338. Counting Bits
    • 406. Queue Reconstruction by Height
    • 46. Permutations
    • 94. Binary Tree Inorder Traversal
    • 739. Daily Temperature
    • 22. Generate Parentheses
    • 78. Subsets
    • 347. Top K Frequent Elements
    • 647. Palindromic Substrings
    • 230. Kth Smallest Element in a BST
    • 238. Product of Array Except Self
    • 1143. Longest Common Subsequence
    • 48. Rotate Image
    • 49. Group Anagrams
    • 39. Combination Sum
    • 454. 4Sum II
    • 62. Unique Paths
    • 378. Kth Smallest Element in a Sorted Matrix
    • 64. Minimum Path Sum
    • 102. Binary Tree Level Order Traversal
    • 289. Game of Life
    • 145. Binary Tree Postorder Traversal
    • 287. Find the Duplicate Number
    • 215. Kth Largest Element in an Array
    • 328. Odd Even Linked List
    • 875. Koko Eating Bananas
    • 384. Shuffle an Array
    • 341. Flatten Nested List Iterator
    • 96. Unique Binary Search Trees
    • 11. Container With Most Water
    • 337. House Robber III
    • 394. Decode String
    • 371. Sum of Two Integers
    • 621. Task Scheduler
    • 208. Implement Trie (Prefix Tree)
    • 114. Flatten Binary Tree to Linked List
    • 105. Construct Binary Tree from Preorder and Inorder Traversal
    • 75. Sort Colors
    • 131. Palindrome Partitioning
    • 103. Binary Tree Zigzag Level Order Traversal
    • 36. Valid Sudoku
    • 17. Letter Combinations of a Phone Number
    • 309. Best Time to Buy and Sell Stock with Cooldown
    • 279. Perfect Squares
    • 380. Insert Delete GetRandom O(1)
    • 116. Populating Next Right Pointers in Each Node
    • 236. Lowest Common Ancestor of a Binary Tree
    • 200. Number of Islands
    • 437. Path Sum III
    • 416. Partition Equal Subset Sum
    • 1049. Last Stone Weight II
    • 494. Target Sum
    • 16. 3Sum Closest
    • 148. Sort List
    • 207. Course Schedule
    • 560. Subarray Sum Equals K
    • 438. Find All Anagrams in a String
    • 300. Longest Increasing Subsequence
    • 240. Search a 2D Matrix II
    • 162. Find Peak Element
    • 73. Set Matrix Zeroes
    • 134. Gas Station
    • 139. Word Break
    • 210. Course Schedule II
    • 395. Longest Substring with At Least K Repeating Characters
    • 787. Cheapest Flights Within K Stops
    • 56. Merge Intervals
    • 334. Increasing Triplet Subsequence
    • 713. Subarray Product Less Than K
    • 142. Linked List Cycle II
    • 221. Maximal Square
    • 138. Copy List with Random Pointer
    • 227. Basic Calculator II
    • 6. ZigZag Conversion
    • 150. Evaluate Reverse Polish Notation
    • 34. Find First and Last Position of Element in Sorted Array
    • 322. Coin Change
    • 79. Word Search
    • 19.Remove Nth Node From End of List
    • 33. Search in Rotated Sorted Array
    • 63. Unique Paths II
    • 146. LRU Cache
    • 2. Add Two Numbers
    • 54. Spiral Matrix
    • 55. Jump Game
    • 50. Pow(x, n)
    • 3. Longest Substring Without Repeating Characters
    • 152. Maximum Product Subarray
    • 5. Longest Palindromic Substring
    • 179. Largest Number
    • 324. Wiggle Sort II
    • 127. Word Ladder
    • 91. Decode Ways
    • 15. 3Sum
    • 98. Validate Binary Search Tree
    • 130. Surrounded Regions
    • 8. String to Integer (atoi)
    • 29. Divide Two Integers
    • 166. Fraction to Recurring Decimal
    • 72. Edit Distance
    • 295. Find Median from Data Stream
    • 123. Best Time to Buy and Sell Stock III
    • 829. Consecutive Numbers Sum
    • 31. Next Permutation
    • 173. Binary Search Tree Iterator
    • 92. Reverse Linked List II
    • 95. Unique Binary Search Trees II
    • 24. Swap Nodes in Pairs
    • 209. Minimum Size Subarray Sum
    • 199. Binary Tree Right Side View
    • 120. Triangle
    • 188. Best Time to Buy and Sell Stock IV
    • 442. Find All Duplicates in an Array
    • 222. Count Complete Tree Nodes
    • 47. Permutations II
    • 109. Convert Sorted List to Binary Search Tree
    • 18. 4Sum
    • 153. Find Minimum in Rotated Sorted Array
    • 654. Maximum Binary Tree
    • 695. Max Area of Island
    • 547. Friend Circles
    • 43. Multiply Strings
    • 310. Minimum Height Trees
    • 516. Longest Palindromic Subsequence
    • 241. Different Ways to Add Parentheses
    • 863. All Nodes Distance K in Binary Tree
    • 143. Reorder List
    • 402. Remove K Digits
    • 450. Delete Node in a BST
  • Algorithms & Data Structure
    • Sorting
  • Leetcode SQL
Powered by GitBook
On this page
  • Problem
  • Solution

Was this helpful?

  1. Leetcode

289. Game of Life

https://leetcode.com/problems/game-of-life/

Previous102. Binary Tree Level Order TraversalNext145. Binary Tree Postorder Traversal

Last updated 4 years ago

Was this helpful?

Problem

According to the : "The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conway in 1970."

Given a board with m by n cells, each cell has an initial state live (1) or dead (0). Each cell interacts with its (horizontal, vertical, diagonal) using the following four rules (taken from the above Wikipedia article):

  1. Any live cell with fewer than two live neighbors dies, as if caused by under-population.

  2. Any live cell with two or three live neighbors lives on to the next generation.

  3. Any live cell with more than three live neighbors dies, as if by over-population..

  4. Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction.

Write a function to compute the next state (after one update) of the board given its current state. The next state is created by applying the above rules simultaneously to every cell in the current state, where births and deaths occur simultaneously.

Example:

Input: 
[
  [0,1,0],
  [0,0,1],
  [1,1,1],
  [0,0,0]
]
Output: 
[
  [0,0,0],
  [1,0,1],
  [0,1,1],
  [0,1,0]
]

Follow up:

  1. Could you solve it in-place? Remember that the board needs to be updated at the same time: You cannot update some cells first and then use their updated values to update other cells.

  2. In this question, we represent the board using a 2D array. In principle, the board is infinite, which would cause problems when the active area encroaches the border of the array. How would you address these problems?

Solution

class Solution {
public:
    inline int numLiveNeighbors(vector<vector<int>>& board, int row, int col) {
        const static int dy[8] = {1, 1, 1, 0, -1, -1, -1, 0};
        const static int dx[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
        const int m = board.size(), n = board[0].size();
        int count = 0;
        for (int i = 0; i < 8; ++i) {
            int new_row = row + dy[i];
            int new_col = col + dx[i];
            if (new_row < 0 || new_row >= m) continue;
            if (new_col < 0 || new_col >= n) continue;
            if (board[new_row][new_col] % 2 > 0) ++count;
        }
        return count;
    }
    void gameOfLife(vector<vector<int>>& board) {
        for (int i = 0; i < board.size(); ++i) {
            for (int j = 0; j < board[0].size(); ++j) {
                int num_live = numLiveNeighbors(board, i, j);
                if (board[i][j] % 2 == 0 && num_live == 3) {
                    board[i][j] = 2; continue;
                }
                if (board[i][j] % 2 > 0 && (num_live < 2 || num_live > 3)) {
                    board[i][j] = 3;
                }
            }
        }
        
        for (int i = 0; i < board.size(); ++i) {
            for (int j = 0; j < board[0].size(); ++j) {
                switch (board[i][j]){
                    case 2:
                        board[i][j] = 1;
                        break;
                    case 3:
                        board[i][j] = 0;
                        break;
                }
            }
        }
    } 
};
  • #encoding

Wikipedia's article
eight neighbors