我已经正确地完成了所有代码并坚持这个愚蠢的事情:当上一代与新一代相同时我无法停止打印......所以当打印图案与前一代图案相同时它应该停止。
我需要在调用'step'之前复制电路板,然后比较新的和复制的电路板,只有在它发生变化时才打印 我需要的是创建一个新变量,就像我做 board[] 一样,然后像打印的那样创建一个嵌套循环,然后在里面做 newboard[y][x] = board[y][x]
请帮我解决这个问题,我无法停止打印,它一直在打印。 请告诉我你的语法
void step(int board[][WIDTH], int rows) {
int x, y;
int neighbors[HEIGHT][WIDTH];
for (y = 0; y < rows; y++)
for (x = 0; x < WIDTH; x++)
neighbors[y][x] = count_neighbors(board, rows, y, x);
for (y = 0; y < rows; y++)
for (x = 0; x < WIDTH; x++)
if (board[y][x] == 1) { /* Currently alive */
if (neighbors[y][x] < 2)
board[y][x] = 0; /* Death by boredom */
else if (neighbors[y][x] > 3)
board[y][x] = 0; /* Death by overcrowding */
}
else { /* Currently empty */
if (neighbors[y][x] == 3)
board[y][x] = 1;
}
}
最佳答案
您只需要跟踪更改。与复制和比较整个数组相比,做起来更简单,工作量更少(执行/内存方面):
int step(int board[][WIDTH], int rows) { // now returns a bool
int x, y;
int neighbors[HEIGHT][WIDTH];
int changed = 0; // save changes
for (y = 0; y < rows; y++)
for (x = 0; x < WIDTH; x++)
neighbors[y][x] = count_neighbors(board, rows, y, x);
for (y = 0; y < rows; y++)
for (x = 0; x < WIDTH; x++)
if (board[y][x] == 1) { /* Currently alive */
if (neighbors[y][x] < 2)
{
board[y][x] = 0; /* Death by boredom */
changed = 1; // change happened
}
else if (neighbors[y][x] > 3)
{
board[y][x] = 0; /* Death by overcrowding */
changed = 1; // change happened
}
}
else { /* Currently empty */
if (neighbors[y][x] == 3)
{
board[y][x] = 1;
changed = 1; // change happened
}
}
return changed; // return the status (changed yes/no?)
}
int main(void) {
int board[HEIGHT][WIDTH];
init(board, HEIGHT);
while (1) {
print(board, HEIGHT, WIDTH);
if(step(board, HEIGHT) == 0) // no change
break; // leave the loop
}
return 0;
}
编辑: 如果需要,您也可以计算实际更改(而不是仅仅说是/否)并返回更改次数。可以保持几乎相同。
关于创建新变量并进行嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8960703/