카테고리 없음

[백준/c++] 4396번: 지뢰 찾기

녕이 2022. 10. 5. 11:27
728x90

 

https://www.acmicpc.net/problem/4396

 

4396번: 지뢰 찾기

지뢰찾기는 n × n 격자 위에서 이루어진다. m개의 지뢰가 각각 서로 다른 격자 위에 숨겨져 있다. 플레이어는 격자판의 어느 지점을 건드리기를 계속한다. 지뢰가 있는 지점을 건드리면 플레이어

www.acmicpc.net

 

n x n 격자에 m개의 지뢰가 있다.

지뢰가 없는 지점을 누르면 상화좌우, 대각선 칸의 지뢰 개수를 출력한다.

지뢰의 위치를 알려주는 Arr와 현재 플레이어가 플레이하면서 열린 칸을 보여주는 Brr가 주어진다.

 

 

[해결 방법]

 

- Arr를 입력받으면서 지뢰의 위치값을 vector에 저장

- Brr를 전체 돌면서 'x'라면 상하좌우, 대각선 지뢰 개수 카운팅

   여기서 현재 위치의 Arr 값이 * 라면 지뢰를 밟은 것으로 bomb 부울 변수를 true로 변경시켜준다.

   → 지뢰칸을 밟은 것으로 지뢰 칸 모두 * 표시, 다른 지점 모두 . 표시해줘야 하기 때문에 있는 변수

- 따로 새로운 배열을 추가하지 않고 Brr를 업데이트해줬다.

 

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n;
    char Arr[11][11];
    char Brr[11][11];
    vector<pair<int, int>> bombIndex;
    bool bomb = false;
    int dir[8][2] = {{1, 0}, {0,1}, {-1,0}, {0, -1}, {1,1}, {-1,1}, {1,-1}, {-1,-1}};
    
    cin >> n;
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            cin >> Arr[i][j];
            if(Arr[i][j] == '*') bombIndex.push_back({i,j});
        }
    }
    for(int i=0; i<n; i++) for(int j=0; j<n; j++) cin >> Brr[i][j];
    
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            char c = Brr[i][j];
            if(c == 'x'){
                if(Arr[i][j] == '*') bomb = true;
                int cnt = 0;
                for(int d=0; d<8; d++){
                    int dx = i + dir[d][0];
                    int dy = j + dir[d][1];
                    if(0<=dx&&dx<n&&0<=dy&&dy<n){ //범위 내
                        if(Arr[dx][dy] == '*') cnt++;
                    }
                }
                Brr[i][j] = cnt + '0';
            }
        }
    }
    
    if(bomb){
        for(int i=0; i<bombIndex.size(); i++){
            int x = bombIndex[i].first;
            int y = bombIndex[i].second;
            Brr[x][y] = '*';
        }
    }
    
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++) cout << Brr[i][j];
        cout << '\n';
        
    }
    return 0;
}

 

 

 

 

 

 

 

몇번 실패하다 포기했던 간단한 시뮬레이션 문제였다.

오랜만에 실패한 문제들을 보다가 풀어봤는데 반례들을 추가해주니 잘 풀렸다..

반례들을 항상 확인하도록 하자!^^

728x90