Coding_Test_C++

BaekJoon 2140번: 지뢰찾기(C++)

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

 

2140번: 지뢰찾기

지뢰찾기는 N×N에서 이뤄지는 게임이다. 보드의 곳곳에는 몇 개의 지뢰가 숨겨져 있고, 지뢰가 없는 칸에는 그 칸과 인접(상하좌우 및 대각선)해 있는 8개의 칸들에 몇 개의 지뢰가 숨겨져 있는

www.acmicpc.net

풀이법

1) 그리디와 탐색을 진행하여서 문제를 진행하였다.

2) 움직일 수 있는 상하좌우 각 대각선을 배열에 담아서 이를 활용하였으며, 전체를 순회하면서 값은 찾아 주었다.

3) 상하좌우 각 대각선의 값이 0보다 커서 탐색할 수 있다면 답인 answer를 증가시키고 각 값들을 -1씩 해주어서 가능한 모든 경우의 수를 탐색해 주었다.

#include <string>
#include <vector>
#include <queue>
#include <iostream>
#include <set>
using namespace std;
int n;
int ans = 0;
int vx[8] = { -1,-1,-1,0,1,1,1,0 };
int vy[8] = { -1,0,1,1,1,0,-1,-1 };
int arr[101][101];
int answer = 0;
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        string s; cin >> s;
        for (int j = 0; j < s.size(); j++)
        {
            if (s[j] == '#')
                arr[i][j] = 50000;
            else
                arr[i][j] = s[j] -'0';
        }
    }
    for (int i = 1; i < n - 1; i++)
    {
        for (int j = 1; j < n - 1; j++)
        {
            bool check = false;
            for (int k = 0; k < 8; k++)
            {
                int nextX = i + vx[k];
                int nextY = j + vy[k];
                if (arr[nextX][nextY]-1 < 0)
                {
                    check = true;
                    break;
                }
            }
            if (check == false)
            {
                for (int k = 0; k < 8; k++)
                {
                    int nextX = i + vx[k];
                    int nextY = j + vy[k];
                    arr[nextX][nextY]--;
                }
                answer++;
            }
        }
    }
    cout << answer;
    
}