[백준] 4396: 지뢰 찾기

17268 단어 백준백준

https://www.acmicpc.net/problem/4396
Solution Github Link

문제에서 주어지는 것은 두 가지이다.

  1. 지뢰의 위치
  2. 플레이어가 누른 위치

이 상태에서 결과도 두 가지가 나오는데,

  1. 플레이어가 지뢰를 누른 상태
  2. 플레이어가 지뢰를 누르지 않은 상태

위 두 경우의 차이점은, 1번은 지뢰의 위치를 보여주는 반면, 2번은 지뢰의 위치를 보여주지 않는다는 차이점이 있다. 따라서 이 점을 잘 고려하며 문제를 해결해야 한다.

먼저, 지뢰의 위치를 다 입력받은 뒤 사용자가 지뢰를 눌렀는 지 아닌 지를 판단한다.
사용자가 누른 입력이 한 줄씩 들어올 때마다 opened && 지뢰를 확인하여 지뢰를 눌렀다면 int boom = 1 으로 플래그를 설정해둔다. 한 번 지뢰를 눌렀음이 판단되면 이후에는 굳이 재확인을 해줄 필요는 없기 때문에 시간 낭비를 줄이기 위해 if문을 한 번 넣어주었다.

입력이 성공적으로 이뤄진 이후, for문으로 n2n^2번 배열을 돌면서 확인을 해준다.

사용자가 누른 곳이 지뢰인 경우,
지뢰는 터졌고, 모든 지뢰를 보여줘야 하기 때문에 지뢰를 return해야 한다.
반면, 지뢰가 아닌 경우에는 주변의 지뢰 (8방향)을 다 둘러본 뒤 주변에 지뢰가 몇 개인 지 체크하여 해당 숫자를 return해야 한다.

사용자가 누르지 않았지만, 지뢰가 터진 경우에는 원래의 map을 출력해도 무방하며,
사용자가 누르지 않았지만, 지뢰가 터지지 않은 경우에는 전부 .을 출력해줘야 한다.


정답 코드

#include <iostream>
#include <string>

using namespace std;

char	map[11][11];
char	opened[11][11];
int		n, boom;

void	fastio(void);
int		check(int i, int j);

int main(void)
{
	fastio();
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> map[i];
	for (int i = 0; i < n; i++)
	{
		cin >> opened[i];
		if (!boom)
		{
			for (int j = 0; j < n; j++)
				if (opened[i][j] == 'x' && map[i][j] == '*')
				{	boom = 1;	break;	}
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n ; j++)
		{
			if (opened[i][j] == 'x')
			{
				if (map[i][j] == '*')
					cout << map[i][j];
				else
				 	cout << (char)(check(i, j) + '0');
			}
			else if (boom)
				cout << map[i][j];
			else
				cout << ".";
		}
        cout << "\n";
	}
	return (0);
}

int	check(int i, int j)
{
	int	dir[8][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
	int	x, y, check = 0;

	for (int k = 0; k < 8; k++)
	{
		x = i + dir[k][0];
		y = j + dir[k][1];
		if (x >= 0 && y >= 0 && x < n && y < n)
		{
			if (map[x][y] == '*')
				check++;
		}
	}
	return (check);
}


void	fastio(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
}

좋은 웹페이지 즐겨찾기