문제에서 주어지는 것은 두 가지이다.
이 상태에서 결과도 두 가지가 나오는데,
위 두 경우의 차이점은, 1번은 지뢰의 위치를 보여주는 반면, 2번은 지뢰의 위치를 보여주지 않는다는 차이점이 있다. 따라서 이 점을 잘 고려하며 문제를 해결해야 한다.
먼저, 지뢰의 위치를 다 입력받은 뒤 사용자가 지뢰를 눌렀는 지 아닌 지를 판단한다.
사용자가 누른 입력이 한 줄씩 들어올 때마다 opened && 지뢰
를 확인하여 지뢰를 눌렀다면 int boom = 1
으로 플래그를 설정해둔다. 한 번 지뢰를 눌렀음이 판단되면 이후에는 굳이 재확인을 해줄 필요는 없기 때문에 시간 낭비를 줄이기 위해 if
문을 한 번 넣어주었다.
입력이 성공적으로 이뤄진 이후, for문으로 번 배열을 돌면서 확인을 해준다.
사용자가 누른 곳이 지뢰인 경우,
지뢰는 터졌고, 모든 지뢰를 보여줘야 하기 때문에 지뢰를 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);
}