[백준] 4396: 지뢰 찾기
https://www.acmicpc.net/problem/4396
Solution Github Link
문제에서 주어지는 것은 두 가지이다.
- 지뢰의 위치
- 플레이어가 누른 위치
이 상태에서 결과도 두 가지가 나오는데,
- 플레이어가 지뢰를 누른 상태
- 플레이어가 지뢰를 누르지 않은 상태
위 두 경우의 차이점은, 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);
}
Author And Source
이 문제에 관하여([백준] 4396: 지뢰 찾기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@besyia0k0/백준-4396저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)