Deff_Dev
[코드업] 생명 게임 1 (C++) 본문
문제
이 문제는 0(빈칸)과 1(생명)으로 이루어진 25 x 25 맵에서 한 세대가 지날 때 마다 조건에 따라 생명이 죽고 태어난다.
조건
- 생명이 없는 칸의 주위 8칸에 정확히 3마리의 생명이 존재하는 경우 다음 세대에 그 칸에서 생명이 탄생한다.
- 생명이 있는 칸의 주위 8칸에 4마리 이상 또는 1마리 이하의 생명이 존재하는 경우 다음 세대에 그 칸의 생명은 죽는다.
- 생명이 있는 칸의 주위 8칸에 2마리 또는 3마리의 생명이 존재하는 경우 다음 세대에 그 칸의 생명은 생존한다.
현재 세대의 맵이 입력될 때, 위 조건에 따라 다음 세대의 맵을 출력한다.
풀이
- 현재 세대의 맵을 입력 받는다.
- 다음 세대의 맵을 현재 세대의 맵과 동일하게 초기화한다.
- 현재 세대의 맵을 순회하면서 각 칸마다 8방향으로 탐색하여 생명(1)의 개수를 세고, 조건에 따라 다음 세대의 맵을 갱신한다.
- 모든 칸에 대해 탐색을 완료한 후에 다음 세대의 맵을 출력한다.
#include <iostream>
// https://codeup.kr/problem.php?id=1515
using namespace std;
int map[26][26] = { 0, }; // 맵
int printMap[26][26] = { 0, }; // 다음 세대 맵
// 8 방향을 나타내는 배열 => x방향, y방향
int dx[8] = { 1,1,1,-1,-1,-1,0,0 };
int dy[8] = { -1,1,0,-1,1,0,1,-1 };
void NextGeneration() {
for (int i = 1; i <= 25; i++) {
for (int j = 1; j <= 25; j++) {
int count = 0;
for (int x = 0; x < 8; x++) { // 8 방향 탐색
if (map[i + dx[x]][j + dy[x]] == 1) { // 생명이 있을 경우 count ++
count++;
}
}
// 생명이 없는 칸 주변에 3개의 생명이 있을 때 생명 탄생
if (map[i][j] == 0 && count == 3) {
printMap[i][j] = 1;
}
else if (map[i][j] == 1 && (count >= 4 || count <= 1)) {
// 생명이 있는 칸 주변에 4마리 이상 또는 1마리 이하의 생명이 있을 때 그 칸의 생명은 죽음
printMap[i][j] = 0;
}
}
}
}
int main() {
for (int i = 1; i <= 25; i++) { // 맵 입력
for (int j = 1; j <= 25; j++) {
cin >> map[i][j];
printMap[i][j] = map[i][j];
}
}
NextGeneration();
for (int i = 1; i <= 25; i++) { // 다음 세대 맵 출력
for (int j = 1; j <= 25; j++) {
cout << printMap[i][j] << " ";
}
cout << endl;
}
return 0;
}
'코딩테스트 > 코드업' 카테고리의 다른 글
[코드업] 크레이지 아케이드 (C++) (0) | 2024.03.27 |
---|---|
[코드업] 진격 후 결과 (C++) (0) | 2024.03.27 |
[코드업] 지뢰 찾기 1 (C++) (4) | 2024.03.26 |
[코드업] 성실한 개미 (C++) (0) | 2024.03.25 |
[코드업] 설탕과자 뽑기 (C++) (0) | 2024.03.24 |