본문 바로가기

Programming/▷ Algolithm

1520 : 생명 게임 2

가끔 CTF 문제나 wargame 문제가 안풀릴 때 알고리즘 문제를 푸는데 머리식히는데 도움도 되고 재미도 있어서 좋은거 같다

문제 설명    

생명 게임을 일반화 시켜보자.

이번에는 격자판의 크기 a * b가 주어지고,

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

룰은 아래 링크를 따라 생명게임 1을 참고하고(생명게임 1에서 조건들을 일반화 시킴),

k세대가 지난 후의 모습을 출력하시오. 

참고) 생명게임 1

입력

첫번째 줄에 격자판의 크기 행 a, 열 b가 입력된다. (1<=a<=170, 1<=b<=170)

두번째 줄에는 생명이 태어나기 위한 이웃의 수 x, 생명이 살기 위해 필요한 최소 이웃 수 y, 생명이 죽는 최소 이웃수 z가 입력된다. (0 <= x, y, z <= 8)

세번째 줄부터는 a*b 격자판의 크기에 격자값이 입력된다. 1은 생명이 존재하는 것이고, 0은 생명이 존재하지 않는다는 것이다.

마지막 줄에 k가 입력된다. ( 1 <= k <= 1,000 )

출력

k 세대가 지난 후의 모습을 출력하시오.

입력 예시   

5 5 2 1 5 1 1 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 0 1 0 0 0 1 1 1 1

출력 예시

1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 1 1 1 1


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <stdio.h>
int main()
{
    int a[170][170= {0,};
    int b[170][170= {0,};
    int size[2= {0,};
    int i,j,g;
    int k,z;
    int count = 0;
    int k_1=-1, k_2=2;
    int z_1=-1, z_2=2;
    int condition[3= {0,};
    int generation = 0;
    scanf("%d %d",&size[0], &size[1]);
    scanf("%d %d %d"&condition[0], &condition[1], &condition[2]);
 
    for(i=0; i<size[0]; i++)
    {
        for(j=0; j<size[1]; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    scanf("%d"&generation);
 
    for(g=0; g<generation; g++)
    {
        for(i=0; i<size[0]; i++)
        {
            for(j=0; j<size[1]; j++)
            {
                if(a[i][j] == 0)
                {
                    if(i==0)
                        k_1 = 0;
                    else if(i==(size[2]-1))
                        k_2 = 1;
                    if(j==0)
                        z_1 = 0;
                    else if(j==(size[1]-1))
                        z_2 = 1;
  
                    for(k=k_1; k<k_2; k++)
                    {
                        for(z=z_1; z<z_2; z++)
                        {
                            if(k==&& z==0)
                                continue;
                            else if(a[i+k][j+z]==1)
                                count++;
                        }
                    }
                    if(count == condition[0])
                        b[i][j] = 1;
                  
                }
                else
                {
                    if(i==0)
                        k_1 = 0;
                    else if(i==(size[2]-1))
                        k_2 = 1;
                    if(j==0)
                        z_1 = 0;
                    else if(j==(size[1]-1))
                        z_2 = 1;
  
                    for(k=k_1; k<k_2; k++)
                    {
                        for(z=z_1; z<z_2; z++)
                        {
                            if(k==&& z==0)
                                continue;
                            else if(a[i+k][j+z]==1)
                                count++;
                        }
                    }
                    if((count>=condition[1])&&(count<condition[2]))
                        b[i][j] = 1;
                }
                count=0;
                k_1 = -1;
                k_2 = 2;
                z_1 = -1;
                z_2 = 2;
            }
        }
        for(i=0; i<size[0]; i++)
        {
            for(j=0; j<size[1]; j++)
            {
                a[i][j] = b[i][j];
                b[i][j] = 0;
            }
        }
    }
    for(i=0; i<size[0]; i++, puts(""))
    {
        for(j=0; j<size[1]; j++)
        {
            printf("%d ",a[i][j]);
        }
    }
    return 0;
}
cs