가끔 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==0 && 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==0 && 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 |
'Programming > ▷ Algolithm' 카테고리의 다른 글
중복 효율 매칭 문자열(memmem, strstr) (0) | 2018.05.06 |
---|---|
1515 : 생명 게임 1 (0) | 2018.01.16 |
1099 : [기초-종합+배열] 성실한 개미 (0) | 2017.03.22 |
1098 : [기초-종합+배열] 설탕과자 뽑기 (0) | 2017.03.22 |
1097 : [기초-종합+배열] 바둑알 십자 뒤집기 (0) | 2017.03.22 |