289. Game of Life
Согласно статье Википедии: "Игра Жизнь, также известная просто как Жизнь, — это клеточный автомат, созданный британским математиком Джоном Хортоном Конуэем в 1970 году."
Доска состоит из сетки клеток размером m x n, где каждая клетка имеет начальное состояние: живая (представляется numberм 1) или мёртвая (представляется numberм 0). Каждая клетка взаимодействует с восемью соседями (по горизонтали, вертикали и диагоналям) согласно следующим четырём правилам (взято из вышеупомянутой статьи Википедии):
Любая живая клетка с менее чем двумя живыми соседями умирает, как будто из-за недостатка населения.
Любая живая клетка с двумя или тремя живыми соседями остаётся живой до следующего поколения.
Любая живая клетка с более чем тремя живыми соседями умирает, как будто из-за перенаселения.
Любая мёртвая клетка с ровно тремя живыми соседями становится живой, как будто вследствие размножения.
Следующее состояние создаётся путем одновременного Applications вышеупомянутых правил ко всем клеткам в текущем состоянии, где рождения и смерти происходят одновременно. given текущее состояние сетки m x n, return следующее состояние.
Ejemplo:
Input: board = [[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]]
C# solución
coincidente/originalpublic class Solution {
public void GameOfLife(int[][] board) {
int[] neighbors = {0, 1, -1};
int rows = board.Length;
int cols = board[0].Length;
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
int liveNeighbors = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (!(neighbors[i] == 0 && neighbors[j] == 0)) {
int r = row + neighbors[i];
int c = col + neighbors[j];
if ((r < rows && r >= 0) && (c < cols && c >= 0) && (Math.Abs(board[r][c]) == 1)) {
liveNeighbors++;
}
}
}
}
if ((board[row][col] == 1) && (liveNeighbors < 2 || liveNeighbors > 3)) {
board[row][col] = -1;
}
if (board[row][col] == 0 && liveNeighbors == 3) {
board[row][col] = 2;
}
}
}
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
if (board[row][col] > 0) {
board[row][col] = 1;
} else {
board[row][col] = 0;
}
}
}
}
}
C++ solución
borrador automático, revisar antes de enviar#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public void GameOfLife(int[][] board) {
vector<int>& neighbors = {0, 1, -1};
int rows = board.size();
int cols = board[0].size();
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
int liveNeighbors = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (!(neighbors[i] == 0 && neighbors[j] == 0)) {
int r = row + neighbors[i];
int c = col + neighbors[j];
if ((r < rows && r >= 0) && (c < cols && c >= 0) && (abs(board[r][c]) == 1)) {
liveNeighbors++;
}
}
}
}
if ((board[row][col] == 1) && (liveNeighbors < 2 || liveNeighbors > 3)) {
board[row][col] = -1;
}
if (board[row][col] == 0 && liveNeighbors == 3) {
board[row][col] = 2;
}
}
}
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
if (board[row][col] > 0) {
board[row][col] = 1;
} else {
board[row][col] = 0;
}
}
}
}
}
Java solución
coincidente/originalclass Solution {
public void gameOfLife(int[][] board) {
int[] neighbors = {0, 1, -1};
int rows = board.length;
int cols = board[0].length;
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
int liveNeighbors = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (!(neighbors[i] == 0 && neighbors[j] == 0)) {
int r = (row + neighbors[i]);
int c = (col + neighbors[j]);
if ((r < rows && r >= 0) && (c < cols && c >= 0) && (Math.abs(board[r][c]) == 1)) {
liveNeighbors += 1;
}
}
}
}
if ((board[row][col] == 1) && (liveNeighbors < 2 || liveNeighbors > 3)) {
// -1 signifies the cell is now dead but originally was live.
board[row][col] = -1;
}
if (board[row][col] == 0 && liveNeighbors == 3) {
// 2 signifies the cell is now live but was originally dead.
board[row][col] = 2;
}
}
}
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
if (board[row][col] > 0) {
board[row][col] = 1;
} else {
board[row][col] = 0;
}
}
}
}
}
JavaScript solución
coincidente/originalvar gameOfLife = function(board) {
const neighbors = [0, 1, -1];
const rows = board.length;
const cols = board[0].length;
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
let liveNeighbors = 0;
for (let i of neighbors) {
for (let j of neighbors) {
if (!(i === 0 && j === 0)) {
const r = row + i;
const c = col + j;
if (r >= 0 && r < rows && c >= 0 && c < cols && Math.abs(board[r][c]) === 1) {
liveNeighbors++;
}
}
}
}
if (board[row][col] === 1 && (liveNeighbors < 2 || liveNeighbors > 3)) {
board[row][col] = -1;
}
if (board[row][col] === 0 && liveNeighbors === 3) {
board[row][col] = 2;
}
}
}
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
board[row][col] = board[row][col] > 0 ? 1 : 0;
}
}
};
Python solución
coincidente/originalclass Solution:
def gameOfLife(self, board: List[List[int]]) -> None:
neighbors = [0, 1, -1]
rows = len(board)
cols = len(board[0])
for row in range(rows):
for col in range(cols):
live_neighbors = 0
for i in range(3):
for j in range(3):
if not (neighbors[i] == 0 and neighbors[j] == 0):
r = row + neighbors[i]
c = col + neighbors[j]
if 0 <= r < rows and 0 <= c < cols and abs(board[r][c]) == 1:
live_neighbors += 1
if board[row][col] == 1 and (live_neighbors < 2 or live_neighbors > 3):
board[row][col] = -1
if board[row][col] == 0 and live_neighbors == 3:
board[row][col] = 2
for row in range(rows):
for col in range(cols):
board[row][col] = 1 if board[row][col] > 0 else 0
Go solución
coincidente/originalfunc gameOfLife(board [][]int) {
neighbors := []int{0, 1, -1}
rows := len(board)
cols := len(board[0])
for row := 0; row < rows; row++ {
for col := 0; col < cols; col++ {
liveNeighbors := 0
for _, i := range neighbors {
for _, j := range neighbors {
if !(i == 0 && j == 0) {
r := row + i
c := col + j
if r >= 0 && r < rows && c >= 0 && c < cols && abs(board[r][c]) == 1 {
liveNeighbors++
}
}
}
}
if board[row][col] == 1 && (liveNeighbors < 2 || liveNeighbors > 3) {
board[row][col] = -1
}
if board[row][col] == 0 && liveNeighbors == 3 {
board[row][col] = 2
}
}
}
for row := 0; row < rows; row++ {
for col := 0; col < cols; col++ {
if board[row][col] > 0 {
board[row][col] = 1
} else {
board[row][col] = 0
}
}
}
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
Algorithm
Итерация по клеткам доски:
Пройдите через каждую клетку на доске. Для каждой клетки подсчитайте количество живых соседей, проверяя все восемь соседних клеток.
Применение правил:
На основе количества живых соседей и текущего состояния клетки примените правила игры:
Любая живая клетка с менее чем двумя живыми соседями умирает (становится -1).
Любая живая клетка с двумя или тремя живыми соседями остаётся живой (без изменений).
Любая живая клетка с более чем тремя живыми соседями умирает (становится -1).
Любая мёртвая клетка с ровно тремя живыми соседями становится живой (становится 2).
Обновление доски:
Пройдите через доску ещё раз и обновите состояния клеток:
Если значение клетки больше 0, установите её в 1 (живая).
Если значение клетки меньше или равно 0, установите её в 0 (мёртвая).
😎
Vacantes para esta tarea
Se muestran vacantes activas con etiquetas coincidentes.