题目内容:
这是细胞自动机的非图形版本。细胞自动机是指在一个二维网格内,每一个网格是一个细胞。每个细胞有活和死两种状态。
初始时刻,有些细胞是活的,有些细胞是死的。自动机的每一步,根据每个细胞周围8个格子内的其他细胞的生存情况决定这个细胞下一步是否存活。具体的规则如下:
? 如果该细胞现在是活的,并且周围8个格子中有2或3个活着的细胞,则继续存活;如果周围8个格子中的活着的细胞数量少于2个或多于3个,则死亡;
? 如果该细胞现在是死的,并且周围8个格子中正好有3个活着的细胞,则细胞复活。
? 位于整个网格边缘和顶角的细胞,它的周围细胞可能少于8个。即越过网格的边界不再有细胞。
? 每个细胞的生死变化,都不会影响当前这一步周围的细胞,只会在下一步表现出来。
提示:课程中的代码与上一句描述不同。
输入格式:
首先输入两个正整数,范围为[3,102],依次表示网格的宽度和高度。
然后输入多组正整数,依次表示一个活着的细胞的网格位置,每组数字中,第一个表示行号,第二个表示列号,均从0开始编号。
最后,以“-1 -1”表示不再有活着的细胞。-1 -1不是有效的位置。
然后,以一个正整数,范围为[1,10000],表示要求细胞自动机执行的步数。
输出格式:
输出一个正整数,表示执行完毕后,剩下的活着的细胞的数量。
输入样例:
3 3
1 1 1 2 0 1 2 1
-1 -1
1
输出样例:
7
时间限制:500ms内存限制:32000kb
用面向对象方式编程实现,定义一个Ccell类,里面有Cells二维数组。定义Ccell对象时进行数组初始化,SetCellStat函数用于设置初始细胞,Run函数执行一次自动细胞运算,getLiveNums函数获取活的细胞数量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
//梁笔记 //https://zouzhongliang.com/ import java.util.Scanner; class Ccell{ private Boolean Cells[][]; public Ccell(int h, int w){ Cells = new Boolean[h+2][w+2]; for(int i = 0;i<Cells.length; i++) { for(int j =0; j<Cells[0].length; j++) { Cells[i][j] = false; } } } public void SetCellStat(int row, int col) { Cells[row+1][col+1] = true; } public void Run() { Boolean[][] CellsTemp = new Boolean[Cells.length][Cells[0].length]; for(int i = 0;i<Cells.length; i++) { for(int j =0; j<Cells[i].length; j++) { CellsTemp[i][j] = false; } } for(int row = 1;row<Cells.length-1; row++) { for(int col =1; col<Cells[row].length-1; col++) { int NeighbourCellsNum = getNeighbour(row, col); CellsTemp[row][col] = SetCellStat(Cells[row][col], NeighbourCellsNum); } } setCells(CellsTemp); } public int getLiveNums() { int livenums = 0; for(int row = 0;row<Cells.length; row++) { for(int col =0; col<Cells[0].length; col++) { if (Cells[row][col] == true) livenums++; } } return livenums; } public int getNeighbour(int row,int col) { int NeighbourCellsNum = 0; for(int i = row-1;i<=row+1; i++) { for(int j =col-1; j<=col+1; j++) { if (Cells[i][j] == true) NeighbourCellsNum++; } } if (Cells[row][col] == true) NeighbourCellsNum--; return NeighbourCellsNum; } public Boolean SetCellStat(Boolean CurrCellStat, int NeighbourCellsNum) { Boolean CellStat = false; if (CurrCellStat == true) { if (NeighbourCellsNum ==2 || NeighbourCellsNum ==3) CellStat = true; else CellStat = false; }else { if (NeighbourCellsNum == 3) CellStat = true; } return CellStat; } public Boolean[][] getCells() { return Cells; } public void setCells(Boolean cells[][]) { Cells = cells; } } public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); Ccell CellAutoMach = new Ccell(in.nextInt(),in.nextInt()); while (true) { int i = in.nextInt(); int j = in.nextInt(); if (i == -1 && j == -1) { break; } CellAutoMach.SetCellStat(i, j); } int times = in.nextInt(); for(int i=0;i<times;i++) { CellAutoMach.Run(); } int liveNums = CellAutoMach.getLiveNums(); System.out.println(liveNums); } } |