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