Computer/Algorithm

Daily Algorithm - 크레이지 아케이드

kentakang 2018. 3. 30. 01:20
반응형

문제

게임 "크레이지 아케이드"를 구현해보자.

10*10 크레이지 아케이드 게임 현황이 주어진다.

0은 빈공간을 뜻한다.

1 이상의 수는 물풍선으로, 물풍선은 자신의 숫자만큼 상하좌우로 터진다.

-1은 장애물로, 물풍선이 터질때 물줄기가 여기 닿으면 멈춘다.

그 후 플레이어의 수 n이 입력되고, n개의 플레이어의 행,열이 주어진다.

이 때, 플레이어는 장애물에 위치하지 않는다.

물풍선이 모두 터질 때의 정보를 출력하는 프로그램을 작성하라.

그 방법은 다음과 같다.

1. 보드판을 출력한다.(0은 빈공간, -1은 장애물, -2는 물풍선, 플레이어는 입력된 순서+1로 표현한다.)

2. 플레이어의 생존 유무를 출력한다.

입력

10*10의 보드판이 입력된다.

11번째 줄에 플레이어의 수 n이 입력된다.(1<=n<=8)

12번째 줄부터 플레이어 위(행, 열)가 입력된다.

출력

물풍선이 터진 후의 상태를 출력한다.

예제 입력

0 0 0 -1 0 -1 -1 0 1 -1 
3 0 -1 0 -1 -1 1 0 0 0 
0 -1 3 -1 1 0 0 0 0 0 
0 -1 -1 0 0 0 0 0 0 0 
-1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 5 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 0 0 0 
3
2 2
10 10
3 3

예제 출력

-2 0 0 -1 0 -1 -1 -2 -2 -1 
-2 -2 -1 0 -1 -1 -2 -2 -2 0 
-2 -1 -2 -1 -2 -2 -2 0 0 0 
-2 -1 -1 -2 -2 0 0 0 0 0 
-1 0 0 -2 0 0 0 0 0 0 
0 0 0 -2 0 0 0 0 0 0 
0 0 0 -2 0 0 0 0 0 0 
-2 -2 -2 -2 -2 -2 -2 -2 -2 0 
0 0 0 -2 0 -2 -2 -2 0 0 
0 0 0 -2 0 0 -2 0 0 2 
Character Information
player 1 dead
player 2 survive
player 3 dead

풀이


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

int map[10][10];
int copyMap[10][10];
void bombEvent(int i, int j);
void showMap();

int main()
{
int n;
int *characterInfo;

for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
scanf("%d", &map[i][j]);
}
}

memcpy(copyMap, map, sizeof(map));

for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (map[i][j] >= 1)
bombEvent(i, j);
}
}
scanf("%d", &n);
characterInfo = malloc(sizeof(int) * n);
memcpy(map, copyMap, sizeof(copyMap));
for (int i = 0; i < n; i++)
{
int x, y;

scanf("%d %d", &x, &y);

if (map[x - 1][y - 1] == -2)
{
characterInfo[i] = 1;
}
else
{
map[x- 1][y - 1] = i + 1;
characterInfo[i] = 0;
}
}

showMap();
printf("Character Information\n");

for (int i = 0; i < n; i++)
{
if (characterInfo[i] == 1)
printf("player %d dead\n", i + 1);
else
printf("player %d survive\n", i + 1);
}

free(characterInfo);
}

void bombEvent(int x, int y)
{
int bombSize = map[x][y];

for (int i = x; i <= x + bombSize; i++)
{
if (map[i][y] == -1)
break;
if (i > 9)
continue;

copyMap[i][y] = -2;
}

for (int i = x; i >= x - bombSize; i--)
{
if (map[i][y] == -1)
break;
if (i < 0)
continue;

copyMap[i][y] = -2;
}

for (int i = y; i <= y + bombSize; i++)
{
if (map[x][i] == -1)
break;
if (i > 9)
continue;

copyMap[x][i] = -2;
}

for (int i = y; i >= y - bombSize; i--)
{
if (map[x][i] == -1)
break;
if (i < 0)
continue;

copyMap[x][i] = -2;
}
}

void showMap()
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
printf("%d ", map[i][j]);
}

printf("\n");
}
}


물풍선 줄기가 터지는 코드의 경우 구현하기 간단했다.

다만 처음에는 게임 맵을 배열 하나로만 만들었는데, 

그럴 경우 다른 물풍선이 물풍선이 터지는 범위 안에 있을 경우 해당 물풍선이 터지지 않는 문제가 발생해서 

map 배열을 복사해서 복사된 map 배열을 수정하는 방식으로 구현했다.


문제 출처 : http://codeup.kr/JudgeOnline/problem.php?id=1525



반응형