CodeUp 1520 생명게임 2 문제풀이
2022. 2. 4. 10:53ㆍCodeUp 문제 풀이/C언어 풀이
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 |
---|