2011-11-19 2 views
-2

Conway의 Game of Life에서 균열을 일으킬 것이라고 생각했지만 진지하게 고심하고 있습니다 ... 이것은 놀랍습니다! 누군가 알고리즘 문제를 암시 할 수 있습니까? 그냥 작은 찌르다? 숙제가 아닙니다. C 삶의 게임

#include <stdio.h> 
#include <stdlib.h> 

#define HEIGHT 10 
#define WIDTH 10 

int *gb[HEIGHT]; 
int *gb2[HEIGHT]; 

void copy() { 
    int i, j; 
    for (i = j = 0; i < HEIGHT; i++) { 
    for (; j < WIDTH; j++) { 
     gb2[i][j] = gb[i][j]; 
    } 
    } 
} 

void init() { 
    int i, j; 
    for (i = 0; i < HEIGHT; i++) { 
    gb [i] = malloc(sizeof(int)*WIDTH); 
    gb2[i] = malloc(sizeof(int)*WIDTH); 
    } 
    for (i = j = 0; i < HEIGHT; i++) { 
    for (; j < WIDTH; j++) { 
     gb [i][j] = 0; 
    } 
    } 
    gb[0][0] = 1; 
    gb[0][1] = 1; 
    gb[1][0] = 1; 
    gb[1][1] = 1; 
    copy(); 
} 

void printg() { 
    int i, j; 
    printf(" "); 
    for (i = 0; i < WIDTH; i++) { 
    printf("%2d ", i); 
    } 
    printf("\n\n"); 
    for (i = 0; i < HEIGHT; i++) { 
    printf("%d ", i); 
    for (j = 0; j < WIDTH; j++) { 
     printf(" %c ", gb2[i][j]?'+':'-'); 
    } 
    printf("\n"); 
    } 
} 

void ckill(int i, int j) { 
    gb2[i][j] = 0; 
} 

void clive(int i, int j) { 
    gb2[i][j] = 1; 
} 

void newgen() { 
    int i, j = i = 1, n = 0; 
    for (; i < HEIGHT-1; i++) { 
    for (j = 0; j < WIDTH-1; j++) { 
     if (gb[i][j+1]) n++; 
     if (gb[i+1][j]) n++; 
     if (gb[i+1][j+1]) n++; 
     if (gb[i-1][j-1]) n++; 
     if (gb[i][j-1]) n++; 
     if (gb[i-1][j]) n++; 
     if (gb[i+1][j-1]) n++; 
     if (gb[i-1][j+1]) n++; 

     if (n < 2) ckill(i, j); 
     else if ((n == 2 || n == 3) && gb[i][j]) clive(i, j); 
     else if (n > 3) ckill(i, j); 
     else if (n == 3 && gb[i][j] == 0) clive(i, j); 
    } 
    } 
} 

int main() { 
    int i; 
    init(); 
    newgen(); 
    printg(); 
    for (i = 0; i < HEIGHT; i++) { 
    free(gb[i]); 
    } 
} 

(1, 0) 및 (1, 1) 인 경우는, 입력을 받아 없지만, (0, 0), (0, 1)에서 살아있는 세포로 시작합니다. 한 세대가 지난 후에도 똑같은 상태로 유지되어야하지만 셀을 죽이면 (0, 0)과 (1, 0)만이 살아있게됩니다.

+0

특별히 알려 주실만한 것이 있습니까? 그렇지 않으면 이것은 진짜 질문이 아니기 때문에 아마도 닫힐 것입니다. codereview에서 더 좋을 수도 있습니다. – Marlon

+1

어떤 문제가 발생합니까? 당신의 의견은 무엇입니까? 예상되는 결과는 무엇입니까? 실제 결과는 무엇입니까? 당신의 담당자에게 주어진 –

+3

, 나는 당신이 작동하지 않는 것에 대한 설명이 필요하다는 것을 알 것이라고 생각했을 것입니다. –

답변

5

initcopy에는 두 개의 루프가 있습니다. 내부 루프의 카운터 j은 외부 루프가 아닌 내부 루프에서 초기화되어야합니다.

함수에서 newgen은 셀이 행렬의 가장자리에 있더라도 인접한 셀을 모두 검사합니다. 결과적으로 바운드 데이터 및 정의되지 않은 동작에 액세스하게됩니다.

작은 메모. 좋은 코드를 만들려고 시도하고 똑똑하게하려고하지 마십시오. 루프 외부에서 루프 카운터를 초기화하는 것이 현명하려고합니다 (그러나 실패합니다).