Algorithms

[정올]저글링 방사능 오염

Ohjeonghak 2014. 9. 1. 00:25
반응형


 

저글링 방사능 오염
Time Limit : 1000MS

 

문제
승훈이는 심심한 시간에 스타크래프트(Starcraft) 게임을 하며 놀고 있었다. 스타크래프트 유닛중 하나인 저글링을 한 곳에 몰아세운 뒤, 방사능 오염 공격으로 없애보려고 했다. 그런데 좀 더 재미있게 게임을 하기 위해서 게임을 개조하여 방사능 오면 공격을 가하면 방사능은 1초마다 이웃한 저글링에 오염된다. 그리고 방사능에 오염된 저글링은 3초 후에 죽게 된다. 예를 들어 아래 왼쪽그림과 같이 모여 있는 저글링 중에 빨간 동그라미 표시를 한 저글링에게 방사능 오염공격을 가하면, 총 9초 후에 저글링들이 죽게 된다. 아래 오른쪽에 있는 그림의 숫자들은 각 저글링들이 죽는 시간이다.

저글링을 모아놓은 지도의 크기와 지도상에 저글링들이 놓여 있는 격자 위치가 주어질 때, 총 몇 초 만에 저글링들을 모두 없앨 수 있는지 알아보는 프로그램을 작성하시오.


입력형식
첫째 줄은 지도의 가로, 세로 크기가 주어진다. 지도는 격자 구조로 이루어져 있으며, 크기는 100×100칸을 넘지 않는다.

둘째 줄부터는 지도상에 저글링들이 놓여있는 상황이 주어진다. 1은 저글링이 있는 곳의 표시이고, 0은 없는 곳이다.

마지막 줄에는 방사능오염을 가하는 위치가 가로, 세로 위치로 주어진다.

출력형식
죽을 수 있는 저글링들이 모두 죽을 때까지 몇 초가 걸리는지 첫 번째 줄에 출력하고, 둘째 줄에는 죽지 않고 남아 있게 되는 저글링의 수를 출력하시오.


입력 예
7 8
0010000
0011000
0001100
1011111
1111011
0011100
0011100
0001000
3 5

출력 예
9
0

 

 

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

int map[100][100] = { 0, };

int i = 0, j = 0;
int targetX = 0, targetY = 0;
int x = 0, y = 0;
char temp = 0;
int maxCnt = 0;
int zergling = 0;

void GrassFire(int t_x, int t_y, int cnt);

int main()
{
	scanf("%d %d", &y, &x);

	for (i = 1; i <= x; i++)
	{
		for (j = 1; j <= y; j++)
		{
			scanf("%c", &temp);

			if (temp != '\n')
			{
				map[i][j] = atoi(&temp);
			}
			else
				j--;
		}
	}

	scanf("%d %d", &targetY, &targetX);

	GrassFire(targetY, targetX, 3);

	for (i = 1; i <= x; i++)
	{
		for (j = 1; j <= y; j++)
		{
			if (maxCnt < map[i][j])
				maxCnt = map[i][j];
			if (map[i][j] == 1)
				zergling++;
		}
	}

	printf("%d\n%d\n", maxCnt, zergling);

	return 0;
}

void GrassFire(int t_y, int t_x, int cnt)
{
	if (map[t_x][t_y] == 1)
		map[t_x][t_y] = cnt++;

	if (map[t_x][t_y + 1] == 1 || map[t_x][t_y + 1] > cnt) ⁄⁄오른쪽
		map[t_x][t_y + 1] = cnt;
	if (map[t_x][t_y - 1] == 1 || map[t_x][t_y - 1] > cnt) ⁄⁄왼쪽
		map[t_x][t_y - 1] = cnt;
	if (map[t_x + 1][t_y] == 1 || map[t_x + 1][t_y] > cnt)	⁄⁄아래
		map[t_x + 1][t_y] = cnt;
	if (map[t_x - 1][t_y] == 1 || map[t_x - 1][t_y] > cnt) ⁄⁄위
		map[t_x - 1][t_y] = cnt;
	
	if (map[t_x][t_y + 1] == cnt) ⁄⁄오른쪽
		GrassFire(t_y + 1, t_x, cnt+1);
	if (map[t_x][t_y - 1] == cnt) ⁄⁄왼쪽
		GrassFire(t_y - 1, t_x, cnt+1);	
	if (map[t_x + 1][t_y] == cnt)	⁄⁄아래
		GrassFire(t_y, t_x + 1, cnt+1);	
	if (map[t_x - 1][t_y] == cnt) ⁄⁄위
		GrassFire(t_y, t_x - 1, cnt+1);

}

 

 

반응형

'Algorithms' 카테고리의 다른 글

인수분해(insubunE)  (0) 2014.09.04
최대 공약수(GCD), 최소 공배수(LCM)  (0) 2014.09.03
[정올]동전 자판기  (0) 2014.09.01
[정올] - [1067]종이자르기  (0) 2013.08.15
[리스트: LIST] - 노드(Node)  (0) 2013.08.04