[问答题]
【编程题】
# 背景:
“康威生命游戏”由一个二维的平面网格组成。网格内的每个格子都是一个细胞,包括“存活”和“死亡”两种状态。每个细胞的生存状态由周围最多8个邻居的状态决定。详细规则如下:
* 当前细胞为存活状态时,当周围的存活细胞低于2个时(不包含2个),该细胞变成死亡状态。(模拟生命数量稀少)
* 当前细胞为存活状态时,当周围有2个或3个存活细胞时,该细胞保持原样。
* 当前细胞为存活状态时,当周围有超过3个存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
* 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。(模拟繁殖)
# 任务:
* 实现函数:`private int getNextVal(int[][] arr, int i, int j)`,返回某个元素的生存状态。
* 实现函数:`private int countLivingNeighbors(int[][] arr, int i, int j)`,计算某细胞的存活邻居数量。
初始代码:
public class ShowMeBug {
public final int[][] arr;
public ShowMeBug(int[][] arr) {
this.arr = arr;
}
public static void main(String[] args) {
int[][] arr = new int[][]{
{0, 0, 0},
{1, 1, 1},
{0, 0, 0}
};
final ShowMeBug showMeBug = new ShowMeBug(arr);
showMeBug.updateNextState(arr);
showMeBug.printState();
}
/**
* 输出当前生存状态到控制台
*
*/
public void printState() {
int M = arr.length;
int N = arr[0].length;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
System.out.print(arr[i][j]);
System.out.print("" "");
}
System.out.println();
}
}
/**
* 更新arr下个tick的生存状态
*
* @param arr 当前状态下的数组
*/
public void updateNextState(int[][] arr) {
int M = arr.length;
int N = arr[0].length;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
arr[i][j] = getNextVal(arr, i, j);
}
}
}
/**
* 计算某细胞下个tick的状态
*
* @param arr 当前状态下的数组
* @param i 行索引
* @param j 列索引
* @return 生存返回1,否则返回0
*/
private int getNextVal(int[][] arr, int i, int j) {
int nextVal = 0;
//TODO:请完善该函数,要求:需要调用countLivingNeighbors
return nextVal;
}
/**
* 计算某细胞的存活邻居数量
*
* @param arr 当前状态下的数组
* @param i 行索引
* @param j 列索引
* @return 该元素存活的邻居数量
*/
private int countLivingNeighbors(int[][] arr, int i, int j) {
int count = 0;
//TODO:请完善该函数
return count;
}
}