CodeUp 1520 생명게임 2 문제풀이

2022. 2. 4. 10:53CodeUp 문제 풀이/C언어 풀이

1520 생명 게임 2

https://codeup.kr/problem.php?id=1520

 

 

이 문제는 생명 게임을 일반화 시켰으며, 격자판의 크기 a * b가 주어지고,

생명이 태어나기 위한 조건(x), 생명을 유지하기 위한 최소 조건(y), 생명이 죽는 최소 조건(z)이 입력으로 주어진다.

k세대가 지난 후의 모습을 출력한다. 

 

생명이 태어나는 조건: 생명이 없는 칸에 주위의 생명이 x 마리 이상의 생명이 있으면 다음 세대에 생명이 탄생한다.

 

 

생명이 유지하기 위한 조건: 생명이 있는 칸에 주위의 생명이 y 마리 이상, z 마리 미만의 생명이 있어야 다음 세대에 생명이 유지된다.

 

 

생명이 죽는 조건: 생명이 있는 칸에 주위에 z 마리 이상의 생명, y 마리 미만의 생명이 있으면 다음 세대에 생명은 죽는다.

 

위와 같은 조건을 약간 무식(?)하지만 if 조건문으로 일일이 다 표현하면 아래와 같은 소스코드를 작성할 수 있다.

 

소스코드

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

int main()
{
    int arr[170][170],v[170][170]={0};
    int a,b,i,j,l,k,x,y,z,n=0;
    scanf("%d %d",&a,&b);
    scanf("%d %d %d",&x,&y,&z);


    for(i=0;i<a;i++){
        for(j=0;j<b;j++){
            scanf("%d",&arr[i][j]);
        }
    }
    scanf("%d",&k);

     /*if( a == 79 && b == 88 )
    {
        printf("%d\n ", k);
    }
*/
    for(i=1;i<=k;i++){
        for(j=0;j<a;j++){
            for(l=0;l<b;l++){
                if(j-1>=0&&l-1>=0&&arr[j-1][l-1]==1){
                        //printf("****1   ");
                    n++;
                }
                if(j-1>=0&&arr[j-1][l]==1) {
                    //printf("****2   ");
                    n++;
                }
                if(j-1>=0&&l+1<b&&arr[j-1][l+1]==1){
                    //printf("****3   ");
                    n++;
                }
                if(l-1>=0&&arr[j][l-1]==1) {
                    //printf("****4   ");
                    n++;
                }
                if(l+1<b&&arr[j][l+1]==1){
                    //printf("****5   ");
                    n++;
                }
                if(j+1<a&&l-1>=0&&arr[j+1][l-1]==1){
                    //printf("****6   ");
                    n++;
                }
                if(j+1<a&&arr[j+1][l]==1){
                    //printf("****7   ");
                    n++;
                }
                if(j+1<a&&l+1<b&&arr[j+1][l+1]==1){
                    //printf("****8   ");
                    n++;
                }
                if((n>=y&&n<z)&&arr[j][l]==1)
                    v[j][l]=1;
                else if(n==x&&arr[j][l]==0)
                    v[j][l]=1;
                else if(arr[j][l]==1&&(n>=z||n<y))
                    v[j][l]=0;
                //printf("%d %d => %d\n",j,l,arr[j][l]);
                n=0;
            }
        }
        for(int c=0;c<a;c++){
            for(int d=0;d<b;d++){
                arr[c][d]=v[c][d];
            }
        }
    }
    for(i=0;i<a;i++){
        for(j=0;j<b;j++){
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    //printf("\n\n\n\n\n\n\n");

    /*for(i=0;i<a;i++){
        for(j=0;j<b;j++){
            printf("%d ",v[i][j]);
        }
        printf("\n");
    }*/
    return 0;
}

 

'CodeUp 문제 풀이 > C언어 풀이' 카테고리의 다른 글

CodeUp 1515 생명게임1 풀이집  (2) 2023.11.09