zoukankan      html  css  js  c++  java
  • 生命游戏(4.2leetcode每日打卡)

    根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。
    给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

     如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
     如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
     如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
     如果死细胞周围正好有三个活细胞,则该位置死细胞复活;

    根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。
     
    示例:
    输入:
    [
      [0,1,0],
      [0,0,1],
      [1,1,1],
      [0,0,0]
    ]
    输出:
    [
      [0,0,0],
      [1,0,1],
      [0,1,1],
      [0,1,0]
    ]
     
    思路:遍历每个元素周围的8个方向的元素,判断,进行模拟。
    不过这道题学到的是可以用两个数组: int[] dx = new int[]{0,0,1,-1,1,-1,-1,1}; 与 int[] dy = new int[]{1,-1,0,0,1,1,-1,-1}; 然后还有一个循环从0开始遍历8个方向, int newX = i + dx[k]; 
    , int newY = j + dy[k]; 这样遍历八个方向。
     1 void gameOfLife(int** board, int boardSize, int* boardColSize) {
     2     if (boardColSize[0] == 0)
     3         return;
     4     int a[boardSize][boardColSize[0]];
     5     int dir[8][2] = { {1,0},{0,1},{-1,0},{0,-1},{-1,-1},{1,1},{-1,1},{1,-1} };
     6     int i = 0, j = 0, z;
     7     for (i = 0; i < boardSize; i++)
     8     {
     9         for (j = 0; j < boardColSize[0]; j++)
    10         {
    11             a[i][j] = 0;
    12         }
    13     }
    14 
    15 
    16     for (i = 0; i < boardSize; i++)
    17     {
    18         for (j = 0; j < boardColSize[i]; j++)
    19         {
    20             int k = 0;
    21             for (z = 0; z < 8; z++)
    22             {
    23                 int x = i + dir[z][0];
    24                 int y = j + dir[z][1];
    25                 if (x < 0 || y < 0 || x >= boardSize || y >= boardColSize[0])
    26                 {
    27                     continue;
    28                 }
    29                 if (board[x][y] == 1)
    30                     k++;
    31             }
    32             if (k < 2)
    33                 a[i][j] = 0;
    34             if (board[i][j] == 1 && k >= 2 && k <= 3)
    35                 a[i][j] = 1;
    36             if (board[i][j] == 1 && k > 3)
    37                 a[i][j] = 0;
    38             if (k == 3)
    39                 a[i][j] = 1;
    40         }
    41     }
    42     for (i = 0; i < boardSize; i++)
    43     {
    44         for (j = 0; j < boardColSize[0]; j++)
    45         {
    46             board[i][j] = a[i][j];
    47         }
    48     }
    49 }
     
  • 相关阅读:
    (4.7)怎么捕获和记录SQL Server中发生的死锁?
    SQLSERVER排查CPU占用高的情况
    (4.6)sql server索引缺失提示
    (4.14)向上取整、向下取整、四舍五入取整的实例
    mysql大致学习路径
    (2)linux未使用eth0,未使用IPV4导致无法连接
    (4.13)sql server参数嗅探(parameter sniffing)
    完美女人
    关于box-sizing
    什么是担当
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12617694.html
Copyright © 2011-2022 走看看