BOJ 4108 - 지뢰찾기 링크
(2023.06.29 기준 S5)
R * C 크기를 가진 지뢰밭이 주어진다. 각 칸에는 빈 칸을 나타내는 '.'이나 지뢰를 나타내는 '*'가 적혀 있다.
지뢰가 있지 않은 칸에 '인접한 여덟 칸에 있는 지뢰의 개수'를 적어야 할 때, 완성 및 출력
단순 구현
BOJ 1996 - 지뢰 찾기 풀이와 굉장히 유사하다.
다른 점은 테스트 케이스의 개수, 사각형의 모양, 칸마다 지뢰의 개수 정도? 굳이 다루지 않아도 될 정도라서 그냥 위 풀이를 참고하자.(이번 풀이 글은 그냥 쉬어가자,,)
#include <bits/stdc++.h>
using namespace std;
// 주위 지뢰의 개수를 저장할 행렬
int result[100][100];
// 12시 방향부터 시계 방향으로 8방향
int di[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dj[8] = { 0, 1, 1, 1, 0, -1, -1, -1};
string matrix[100];
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int R, C;
for (cin >> R >> C; R; cin >> R >> C){
for (int i = 0; i < R; i++) cin >> matrix[i];
// 주위 지뢰의 개수를 저장할 행렬 초기화
memset(result, 0, sizeof(result));
// 지뢰가 있는 칸을 찾아 인접해 있는 칸에 1을 더하자.
for (int i = 0; i < R; i++) for (int j = 0; j < C; j++)
if (matrix[i][j] == '*')
for (int k = 0; k < 8; k++){
int ii = i + di[k], jj = j + dj[k];
if (0 <= ii && ii < R && 0 <= jj && jj < C) result[ii][jj] += 1;
}
for (int i = 0; i < R; i++){
for (int j = 0; j < C; j++){
if (matrix[i][j] == '*') // 지뢰가 있는 칸
cout << '*';
else // 지뢰가 없는 칸
cout << result[i][j];
}
cout << '\n';
}
}
}
import sys; input = sys.stdin.readline
# 12시 방향부터 시계 방향으로 8방향
dir = [(-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1)]
while True:
R, C = map(int, input().split())
if not R: break
matrix = [input().strip() for _ in range(R)]
# 주위 지뢰의 개수를 저장할 행렬
result = [[0] * C for _ in range(R)]
# 지뢰가 있는 칸을 찾아 인접해 있는 칸에 1을 더하자.
for i in range(R):
for j in range(C):
if matrix[i][j] == '*':
for di, dj in dir:
if 0 <= i + di < R and 0 <= j + dj < C:
result[i + di][j + dj] += 1
for i in range(R):
for j in range(C):
if matrix[i][j] == '*': # 지뢰가 있는 칸
print('*', end = '')
else: # 지뢰가 없는 칸
print(result[i][j], end = '')
print()