所以,这应该通过一个0' s,' s和1; s(最初都是字符形式,但我设置为整数)的文件,但是当我运行它代码计算相邻的活细胞是错误的,将5个点拉到3个点,其中我的邻居应该有2个。
电流输出; 每个单元格有多少个邻居的邻居方块(计算所有8个周围的区块),然后在基本的生命操作游戏发生后更新矩阵,最后是原始矩阵 这是下面的原始矩阵
0; 0; 0; 0; 0; 0
0; 0; 0; 1; 0; 0
0; 1; 0; 1; 0; 0
0; 0; 1; 1; 0; 0
0; 0; 0; 0; 0; 0
0; 0; 0; 0; 0; 0
其余的过程完美无缺,但邻居的计算并不奏效。我做错了什么?
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void manage_board(FILE *input, int counter, int iterate);
int main (int argc, const char * argv[]){
FILE *input = fopen(argv[1],"r");
int counter = 0,temp1=0,temp2=0;
char temp = fgetc(input);
while (temp != EOF){
if (temp == '1' || temp == '0'){
counter+=1;
}
temp = fgetc(input) ;
}
counter = sqrt(counter);
rewind(input);
manage_board(input,counter, atoi(argv[2]));
fclose(input);
return 0;
}
void manage_board(FILE *input, int counter, int iterate){
int matrix[counter][counter];
FILE *output = fopen("output.csv","w");
int original[counter][counter];
int updated[counter][counter];
int rows = 0,cols = 0, neighbors =0;
char temp = fgetc(input);
/*for (int i=0; i<counter; i++){
for (int j=0; j<counter; j++){
updated[i][j] = 0;
}
printf ("\n");
}*/
while (temp != EOF){
//printf("%c",temp);
if (temp == '1' && temp != ';'){
matrix[cols][rows] = 1;
rows++;
}
else if (temp == '0' && temp != ';'){
matrix[cols][rows] = 0;
rows++;
}
if (rows==6){
cols++;
rows=0;
}
temp = fgetc(input);
}
for (int i=0; i<counter; i++){
for (int j=0; j<counter; j++){
updated[i][j] = 0;
}
//printf ("\n");
}
for (int i=0; i<counter; i++){
for (int j=0; j<counter; j++){
original[i][j] =matrix[i][j];
}
//printf ("\n");
}
for (int loops = 0; loops < iterate;loops++){
for (int i=0; i<counter; i++){
for (int j=0; j<counter; j++){
if ( i !=counter-1){ //down one
if(matrix[i+1][j] == 1){
neighbors ++;
}
}
if ( i !=0){//up one
if(matrix[i-1][j] == 1){
neighbors++;
}
}
if ( j != counter-1){//right one
if (matrix[i][j+1] == 1){
neighbors++;
}
}
if (j !=0 ){//left one
if (matrix[i][j-1] == 1 ){
neighbors++;
}
}
if (i !=counter-1 && j != counter-1){//bot right
if(matrix[i+1][j+1] == 1)
neighbors++;
}
if (j != counter-1 && i !=0 ){//top right
if(matrix[i-1][j+1] == 1){
neighbors++;
}
}
if (j !=0 && i !=0){//top left
if (matrix[i-1][j-1] == 1){
neighbors++;
}
}
if (i !=counter-1 && j !=0 ){//bottom left
if (matrix[i+1][j-1] == 1){
neighbors++;
}
}
///printf("%d", matrix[i][j]);
//printf ("%d ",neighbors);
if (neighbors < 2 ){
updated[i][j]=0;
}
else if (neighbors == 2 && matrix[i][j] == 1)
updated[i][j]=1;
else if (neighbors > 3){
updated[i][j]=0;
}
else if (neighbors = 3){
updated[i][j]=1;
}
printf("%d ",neighbors);
neighbors = 0;
}
printf("\n");
}
for (int i=0; i<counter; i++){
for (int j=0; j<counter; j++){
matrix[i][j]= updated[i][j];
printf("%d",updated[i][j]);
updated[i][j] = 0;
}
printf("\n");
}
}
printf("original board\n");
for (int i=0; i<counter; i++){
for (int j=0; j<counter; j++){
printf("%d", original[i][j]);
}
printf ("\n");
}
//printf(" \nnew matrix\n\n");
/* for (int i=0; i<counter; i++){
for (int j=0; j<counter; j++){
if (updated[i][j] == 1){
fprintf( output, "%d %d \n", i, j);
//printf(updated)
}
}
}
*/
/* A live cell with fewer than two live neighbors dies.
A live cell with more than three live neighbors also dies.
A live cell with exactly two or three live neighbors lives.
A dead cell with exactly three live neighbors becomes alive.*/
}
这是我的输出
0 0 1 1 1 0
1 1 3 1 3 0
1 1 5 3 3 0
1 3 3 2 3 0
0 1 3 3 1 0
0 0 0 0 0 0
000000
001010
000110
011110
001100
000000
original board
000000
000100
010100
001100
000000
000000
应出现邻居矩阵
0 0 1 1 1 0
1 1 3 1 2 0
1 1 5 3 3 0
1 2 3 2 2 0
0 1 2 2 1 0
0 0 0 0 0 0
答案 0 :(得分:0)
有一些错误:
1。 首先,您只处理固定数量的列:
if (rows==6){
cols++;
rows=0;
}
这一定是
if (rows==counter){
cols++;
rows=0;
}
您在阅读6个值后开始新行。为此,您有一个额外的参数counter
。请记住:你没有固定的尺寸。
如果您的输入不是6 * 6字段,则会将读取的值放在错误的位置。
2。
除此之外,您的初始数组matrix
未初始化并包含垃圾值。这显然会弄乱你的结果。
解决方案很简单:
使用memset
或创建一个小循环将所有内容设置为0。
3。
对于每个字符,您增加rows
这是错误的。您切换了行和列。但是,由于你只接受方形输入字段,这确实很重要。
4。
最后你的问题:
你的计数是正确的,但在采取行动时你会破坏neighbors
的价值。
else if (neighbors = 3){
updated[i][j]=1;
}
应该有==
您的编译器应该对此发出警告。