※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 4108번 문제인 지뢰찾기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/4108
4108번: 지뢰찾기
C개의 문자들이 포함된 R개의 줄을 출력한다. 단, 모든 '.' 대신 인접한 칸에 위치한 지뢰의 수로 변경해 출력한다. '*' 칸은 그대로 출력한다. 문자 사이에 공백이나 줄 사이에 공백 줄이 있어선
www.acmicpc.net
각 칸의 인접 지뢰를 세는 배열을 먼저 준비하자. 그리고 각 지뢰칸마다 인접한 8방향의 칸에 인접 지뢰의 개수를 1씩 늘려 지뢰가 아닌 칸의 인접 지뢰 개수를 전부 구하자.
문제의 답은 지뢰칸의 경우 애스터리스크('*')를, 아닌 경우 위에서 구한 인접 지뢰의 개수를 이용해 출력할 수 있다.
아래 구현에서와 같이 dr, dc 등의 배열을 이용하면 8방향의 칸을 살피는 구현을 간략하게 할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int R, C;
string board[100];
int ans[100][100];
int dr[8] = { 1,1,1,0,-1,-1,-1,0 };
int dc[8] = { 1,0,-1,-1,-1,0,1,1, };
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> R >> C;
while (R + C) {
for (int r = 0; r < R; r++) {
cin >> board[r];
for (int c = 0; c < C; c++) ans[r][c] = 0;
}
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
if (board[r][c] == '*') {
for (int k = 0; k < 8; k++) {
int rr = r + dr[k], cc = c + dc[k];
if (rr < 0 || rr >= R || cc < 0 || cc >= C) continue;
ans[rr][cc]++;
}
}
}
}
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
if (board[r][c] == '*') cout << '*';
else cout << ans[r][c];
}
cout << '\n';
}
cin >> R >> C;
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1750 // C++] 서로소의 개수 (1) | 2024.01.03 |
---|---|
[BOJ 2436 // C++] 공약수 (1) | 2024.01.02 |
[BOJ 2624 // C++] 동전 바꿔주기 (1) | 2023.12.31 |
[BOJ 3077 // C++] 임진왜란 (0) | 2023.12.30 |
[BOJ 3075 // C++] Astromeeting (1) | 2023.12.29 |