生命游戏
题目
一个二维方格世界,每个方格只能存活一个细胞。每个细胞在下一个时刻是否存活取决于这一个时刻相邻八个方格中细胞的总数量,每个空格在下一个时刻是否产生细胞也取决于这一个时刻相邻八个方格中细胞的总数量,规则如下:
- 如果一个空格周围有且只有3个活着的细胞,则该空格产生一个细胞。
- 如果一个细胞周围有且只有2个或3个活着的细胞,则该细胞继续存活。
- 在其它情况下,细胞要么拥挤而死,要么孤独而死。
样例
输入
49 20
.................................................
.................................................
.................................................
.......................OOO.......................
.................................................
........................O........................
........................O........................
........................O........................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
提示
编译前下载头文件util.h
#include <bits/stdc++.h>
#include "util.h"
using namespace std;
int main()
{
/*
TODO
*/
clear();
for (int i = 0; true; i++) {
pause(100);
recursor();
for (int y = 0; y < CELLS_HEIGHT; y++) {
for (int x = 0; x < CELLS_WIDTH; x++) {
if (cells[y][x]) cout << 'O';
else cout << ' ';
}
cout << '\n';
}
/*
TODO
*/
}
return 0;
}
答案
#include <bits/stdc++.h>
#include "util.h"
using namespace std;
int main() {
freopen("in.txt", "r", stdin);
int CELLS_WIDTH, CELLS_HEIGHT;
cin >> CELLS_WIDTH >> CELLS_HEIGHT;
auto cells = vector<vector<bool>>(CELLS_HEIGHT, vector<bool>(CELLS_WIDTH, false));
for (int y = 0; y < CELLS_HEIGHT; y++) {
for (int x = 0; x < CELLS_WIDTH; x++) {
char c;
cin >> c;
if (c == 'O') cells[y][x] = true;
}
}
clear();
for (int i = 0; true; i++) {
pause(100);
recursor();
for (int y = 0; y < CELLS_HEIGHT; y++) {
for (int x = 0; x < CELLS_WIDTH; x++) {
if (cells[y][x]) cout << 'O';
else cout << ' ';
}
cout << '\n';
}
auto next_cells = vector<vector<bool>>(CELLS_HEIGHT, vector<bool>(CELLS_WIDTH, false));
for (int y = 0; y < CELLS_HEIGHT; y++) {
for (int x = 0; x < CELLS_WIDTH; x++) {
int count = 0;
if (y == 0 && x == 0) {
if (cells[y][x + 1]) count++;
if (cells[y + 1][x]) count++;
if (cells[y + 1][x + 1])count++;
}
else if (y == 0 && x != 0 && x != CELLS_WIDTH - 1) {
if (cells[y][x - 1]) count++;
if (cells[y][x + 1]) count++;
if (cells[y + 1][x - 1]) count++;
if (cells[y + 1][x]) count++;
if (cells[y + 1][x + 1]) count++;
}
else if (y == 0 && x == CELLS_WIDTH - 1) {
if (cells[y][x - 1]) count++;
if (cells[y + 1][x - 1]) count++;
if (cells[y + 1][x]) count++;
}
else if (y != 0 && y != CELLS_HEIGHT - 1 && x == 0) {
if (cells[y - 1][x]) count++;
if (cells[y - 1][x + 1]) count++;
if (cells[y][x + 1]) count++;
if (cells[y + 1][x]) count++;
if (cells[y + 1][x + 1]) count++;
}
else if (y == CELLS_HEIGHT - 1 && x == 0) {
if (cells[y - 1][x]) count++;
if (cells[y - 1][x + 1]) count++;
if (cells[y][x + 1]) count++;
}
else if (y == CELLS_HEIGHT - 1 && x != 0 && x != CELLS_WIDTH - 1) {
if (cells[y - 1][x - 1]) count++;
if (cells[y - 1][x]) count++;
if (cells[y - 1][x + 1]) count++;
if (cells[y][x - 1]) count++;
if (cells[y][x + 1]) count++;
}
else if (x == CELLS_WIDTH - 1 && y != 0 && y != CELLS_HEIGHT - 1) {
if (cells[y - 1][x - 1]) count++;
if (cells[y - 1][x]) count++;
if (cells[y][x - 1]) count++;
if (cells[y + 1][x - 1]) count++;
if (cells[y + 1][x]) count++;
}
else if (y == CELLS_HEIGHT - 1 && x == CELLS_WIDTH - 1) {
if (cells[y - 1][x - 1]) count++;
if (cells[y - 1][x]) count++;
if (cells[y][x - 1]) count++;
}
else if (y != 0 && x != 0 && y != CELLS_HEIGHT - 1 && x != CELLS_WIDTH - 1) {
if (cells[y - 1][x - 1]) count++;
if (cells[y - 1][x]) count++;
if (cells[y - 1][x + 1]) count++;
if (cells[y][x - 1]) count++;
if (cells[y][x + 1]) count++;
if (cells[y + 1][x - 1]) count++;
if (cells[y + 1][x]) count++;
if (cells[y + 1][x + 1]) count++;
}
if (count <= 1 || count >= 4) next_cells[y][x] = false;
else if (count == 3) next_cells[y][x] = true;
else next_cells[y][x] = cells[y][x];
}
}
cells = next_cells;
}
return 0;
}