创建新变量并进行嵌套循环

标签 c

我已经正确地完成了所有代码并坚持这个愚蠢的事情:当上一代与新一代相同时我无法停止打印......所以当打印图案与前一代图案相同时它应该停止。

我需要在调用'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/

相关文章:

c - 与暂停()类似的函数?

c - 无约束内联汇编的引用变量

c++ - 警告 : comparison of distinct pointer types

c - 快速阈值和位打包算法(可能的改进?)

_Atomic 类型说明符和限定符之间的 C11 语法歧义

c++ - 如何将日期保存在二进制文件中然后读取该文件并打印它?

c - 数字解析器程序 : why strtol/strtod fails for exponential and hex numbers

c - Eclipse:用 C 创建 Hello World 应用程序

c - strtok() 段错误

c - scanf() 函数不起作用?