github仓库:https://github.com/lzed/leetcode
给出一个矩阵的一个状态,根据一定规则来计算下一个状态。
新开一个数组来获得下一个状态即可,这样可以保证状态互不干扰。
要更新一个位置
那么,一共只有4种转化(1代表Live,0代表dead)
于是,在对
最后统计结果的时候,我们再对上述关系进行逆映射来得到最后结果。
algorithm 1
class Solution {public: int judge(int x, int y, vector<vector<int>>& a) { int cnt = 0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (!i && !j) continue; int nx = x + i, ny = y + j; if (nx >= 0 && nx < a.size() && ny >= 0 && ny < a[0].size()) { if (a[nx][ny]) cnt++; } } } return cnt; } void gameOfLife(vector<vector<int>>& board) { int m = board.size(); if (m) { int n = board[0].size(); vector<vector<int>> a(board.size(), vector<int>(n)); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { int t = judge(i, j, board); if (board[i][j]) { if (t < 2) a[i][j] = 0; else if (t == 2 || t == 3) a[i][j] = 1; else a[i][j] = 0; } else { if (t == 3) a[i][j] = 1; else a[i][j] = 0; } } } board = a; } }};algorithm 2
class Solution {public: int f(int x, int y) { if (!x && !y) return 2; if (!x && y) return 3; if (x && !y) return 4; return 5; } int g_PRe(int s) { if (s == 1 || s == 0) return s; if (s == 2 || s == 3) return 0; return 1; } int g_now(int s) { if (s == 1 || s == 0) return s; if (s == 2 || s == 4) return 0; return 1; } int judge(int x, int y, vector<vector<int>>& a) { int cnt = 0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (!i && !j) continue; int nx = x + i, ny = y + j; if (nx >= 0 && nx < a.size() && ny >= 0 && ny < a[0].size()) { if (g_pre(a[nx][ny])) cnt++; } } } return cnt; } void gameOfLife(vector<vector<int>>& board) { int m = board.size(); if (m) { int n = board[0].size(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { int t = judge(i, j, board); if (board[i][j]) { if (t < 2 || t >= 4) board[i][j] = f(1, 0); else board[i][j] = f(1, 1); } else { if (t == 3) board[i][j] = f(0, 1); else board[i][j] = f(0, 0); } } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) board[i][j] = g_now(board[i][j]); } } }};新闻热点
疑难解答