1. 문제 정보
https://www.acmicpc.net/problem/4396
2. 풀이 로직
1. mines 배열을 생성하여 지뢰 정보를 담습니다.
2. 사용자가 밟은 지역을 표시하는 opend 배열을 만듭니다.
3. 각 지역을 순회하며, 만약 해당 위치가 'x'라면 주변 8방향으로 지뢰의 개수를 확인하고 표시합니다.
4. 사용자가 지뢰를 밟은 적이 있다면, 모든 지뢰를 공개합니다.
5. 최종 보드를 출력합니다.
📛 실수할 수도 있는 부분
'x' 자리에 지뢰가 있다면, 'x'와 상관없이 모든 지뢰를 공개해야 합니다. 이를 판단하기 위해 hitMine 변수를 사용합니다.
3. C++ 정답 코드
#include <iostream>
#include <string>
using namespace std;
void printResult(int N);
char checkMine(int r, int c, int N);
int dx[8] = { 0,-1,0,1,-1,-1,1,1 };
int dy[8] = { 1,0,-1,0,1,-1,1,-1 };
char mines[10][10]; //지뢰 위치가 표시되어 있는 보드판
char opend[10][10]; //사용자가 열어놓은 위치를 저장하는 보드판
bool hitMine = false;
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
cin >> mines[i][j];
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
cin >> opend[i][j];
if (opend[i][j] == 'x') //사용자가 연 보드판이라면
opend[i][j] = checkMine(i, j, n); //해당 위치 8방향의 지뢰갯수 표시
}
}
if (hitMine)
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (mines[i][j] == '*') //사용자가 연 보드판이라면
opend[i][j] = '*'; //해당 위치 8방향의 지뢰갯수 표시
}
}
}
printResult(n);
return 0;
}
void printResult(int N)
{
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cout << opend[i][j]; //결과 보드판 출력
}
cout << '\n';
}
}
//해당위치로부터 8방향(상, 하, 좌, 우, 대각선)의 지뢰갯수 반환
char checkMine(int r, int c, int N)
{
if (mines[r][c] == '*')//지뢰를 밟았다면
{
hitMine = true;
return '*';
}
int count = 0;
for (int i = 0; i < 8; i++) {
int ny = r + dy[i], nx = c + dx[i];
if ( ny < 0 || nx < 0 ||ny >= N || nx >= N)continue;
if (mines[ny][nx] == '*')
count++;
}
string cnt = to_string(count);
return cnt[0];
}
'🏆 PS(Problem Solving) > Baekjoon' 카테고리의 다른 글
[Node.js] 백준 Javascript 20436 ZOAC 3 (1) | 2024.06.03 |
---|---|
[Node.js] 백준 Javascript 1244 스위치 켜고 끄기 (0) | 2024.06.01 |
[Node.js] 백준 Javascript 4396 지뢰 찾기 (0) | 2024.06.01 |
[Node.js] 백준 javascript 2578 빙고 (0) | 2024.05.30 |
[C++] 백준 2578 빙고 (0) | 2024.05.30 |