国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Leetcode 289 - Game of Life(array)

2019-11-08 01:38:32
字體:
來源:轉載
供稿:網友

github倉庫:https://github.com/lzed/leetcode

題意

給出一個矩陣的一個狀態,根據一定規則來計算下一個狀態。

思路

算法1

O(mn)的額外空間。

新開一個數組來獲得下一個狀態即可,這樣可以保證狀態互不干擾。

算法2

O(1)額外空間,O(mn)時間。

要更新一個位置(i,j)的時候,我們需要知道它的neibor的狀態,但是neibor的狀態可能已經被更新過,但是我們依賴的是以前的狀態,然后最后的結果統計又依賴于最后的狀態。即又依賴于之前的狀態,又依賴于之后的狀態,那么我們就可以建立一個狀態轉化的映射:

f(x,y)=s:分別代表之前狀態是x,轉化為一個新的狀態y,我們用s代表其接結果。

那么,一共只有4種轉化(1代表Live,0代表dead)

f(0,0)=2

f(0,1)=3

f(1,0)=4

f(1,1)=5

于是,在對(i,j)進行狀態更新時,我們可以通過上面的轉換表得到它周圍的更新/未更新位置的初始狀態。

最后統計結果的時候,我們再對上述關系進行逆映射來得到最后結果。

代碼

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]); } } }};
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蒙自县| 札达县| 长白| 汉沽区| 泌阳县| 东明县| 始兴县| 乡宁县| 双峰县| 荃湾区| 左云县| 西丰县| 辽宁省| 岑溪市| 临武县| 望都县| 东方市| 九江县| 盖州市| 永城市| 安多县| 宜丰县| 宣化县| 邳州市| 汝阳县| 桂东县| 日照市| 施秉县| 裕民县| 渭源县| 阳高县| 洛隆县| 宝应县| 呼图壁县| 庆元县| 迁西县| 右玉县| 通州市| 凌源市| 迁西县| 武功县|