我正在开发 1D Game of Life(基于Mathworld中规定的规则)。本质上,每一代都表示为一行 0 或 1(死或活),并且下一代是基于“规则”命令行参数的二进制表示创建的。
例如,规则 30 变为 00011110(30 的二进制),这用于确定哪些位模式将产生新的单元格或在下一代中自行消亡。
为了对此进行编程,我需要能够访问前一行中的三个一组的位(以应用规则)。下面是一个示例图像(请注意,起始行始终为 0,中间为 1):
00000100000 #seed row
11001011001 #generated from seed row
...........
11110010101 #n-th row, generated from n-1 row
为了生成一行,我必须以三个一组的方式查看上面一行中的位,然后将规则应用为 1/0,生死决定。
基本上我计划匹配 3 位模式和规则,并使用它为后代打印 0 或 1。这是一般算法:
if three_bit_pattern == 'xxx' && rule[x] == 0/1 {print 0/1} else {print 1/0}
我遇到困难的程序部分是访问前一行的内容。我所有的尝试都会产生垃圾或不正确的数据。
简而言之,我如何以三位为一组访问前一行的值?
行是这样创建的:
int i, j, k;
int row = atoi(argv[1]) + 1;
int col = 2 * atoi(argv[1]) + 1;
int arr[col];
int output[col];
char rule[9]; //binary representation of rule (2^8 stores up to 255 + null term)
int2binary(atoi(argv[2]), &rule, 10);
for(i = 0; i < row; i++){
for(j = 0; j < col; j++){
if(i == 0){
if(j == col / 2) //print 1 in center of first row
arr[i] = 1;
else
arr[i] = 0;
printf("%d", arr[i]);
}
else{
//output[i] = arr[i-1];
output[i+1] = arr[i];
output[i+2] = arr[i+1];
output[i+3] = arr[i+2];
printf("%s", output);
}
}//end inner for_loop
printf("\n");
}//end outer for_loop
}
好的,所以我让这变得简单了很多,我只需要两个数组(一个保存前一列,一个保存当前列)。我不明白为什么打印输出数组会产生垃圾?output[i] = arr[i] 不是一个有效的表达式吗?