BOJ 2140 지뢰찾기
https://www.acmicpc.net/problem/2140
단순하게 구현하면 되는 문제입니다.
맵의 크기가 n이라고 가정했을 때,
테두리 옆의 # 즉 숫자 옆의 #들만 신경쓰면 됩니다.
그 외의 #들은 지뢰가 있을 수도 있고 없을 수도 있지만, 저희는 다 있다고 가정하고 풀어야합니다.
문제에서 요구하는 것이 최댓값이기 때문입니다.
테두리 옆의 #들은 8방향으로 검사를 해서 만약 주변의 숫자 중에 0인 것이 없다면 지뢰가 있어야하는 자리입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <iostream> #include <queue> using namespace std; char map[100][105]; int dx[8] = { 1, 0, -1, 0, -1, 1, 1, -1 }; int dy[8] = { 0, 1, 0, -1, 1, 1, -1, -1 }; int n; bool check(int x, int y) { for (int i = 0; i < 8; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx < 0 || ny < 0 || nx >= n || ny >= n) { continue; } if (map[nx][ny] == '0') return 0; } return 1; } void doMinus(int x, int y) { for (int i = 0; i < 8; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx < 0 || ny < 0 || nx >= n || ny >= n) { continue; } if (map[nx][ny] >= '0' && map[nx][ny] <= '9') map[nx][ny]--; } } int main() { cin >> n; if (n <= 2) { cout << 0; return 0; } int ret = (n - 2) * (n - 2); for (int i = 0; i < n; i++) cin >> map[i]; for (int i = 1; i < n - 1; i++) { for (int j = 1; j < n - 1; j++) { if (i == 1 || j == 1 || i == n - 2 || j == n - 2) { if (check(i, j)) { doMinus(i, j); } else { ret--; } } } } cout << ret; return 0; } | cs |
'알고리즘 > 구현' 카테고리의 다른 글
[3190] 뱀 (4) | 2018.01.10 |
---|---|
[12845] 모두의 마블 (0) | 2017.08.26 |
[12841] 정보대 등산 (0) | 2017.08.23 |
[1700] 멀티탭 스케줄링 (0) | 2017.08.01 |
[1992] 쿼드 트리 (0) | 2017.07.30 |