반응형
https://www.acmicpc.net/problem/17135
17135번: 캐슬 디펜스
첫째 줄에 격자판 행의 수 N, 열의 수 M, 궁수의 공격 거리 제한 D가 주어진다. 둘째 줄부터 N개의 줄에는 격자판의 상태가 주어진다. 0은 빈 칸, 1은 적이 있는 칸이다.
www.acmicpc.net
[ 문제풀이 ]
dfs를 이용하여 궁수의 위치를 정하고, 시뮬레이션을 통해서 죽인 적의 최댓값을 ans에 저장해 출력하였습니다.
[ 소스코드 ]
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include<iostream> #include<vector> using namespace std; int N, M, D; int arr[15][15]; int arrow[3]; int ans; int cnt() //죽인 적의 수 { int temp[16][15] = { 0 }; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { temp[i][j] = arr[i][j]; } } int ret = 0; while (1) { vector<pair<int, int>> die; //죽일 수 있는 적의 좌표 저장 for (int k = 0; k < 3; k++) { int min = 987654321; int y; int x; for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { if (temp[j][i] == 1) { if (min > abs(arrow[k] - i) + N - j) { y = j; x = i; min = abs(arrow[k] - i) + N - j; } } } } if (min <= D) { //거리 안에 있다면 좌표 저장 die.push_back({ y,x }); } } for (auto next : die) { //좌표가 중복될 수 있으므로 한번에 처리 if (temp[next.first][next.second] == 1) { temp[next.first][next.second] = 0; ret++; } } for (int i = N - 1; i >= 0; i--) { //한칸씩 밀기 for (int j = 0; j < M; j++) { if (temp[i][j] == 1) { temp[i + 1][j] = 1; temp[i][j] = 0; } } } int flag = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (temp[i][j] == 1) { flag = 1; break; } } if (flag == 1) break; } if (flag == 0) break; //적이 하나도 없다면 } return ret; } void dfs(int level, int num) { if (level == 3) { ans = max(cnt(), ans); return; } for (int i = num; i < M; i++) { //궁수의 위치 arrow[level] = i; dfs(level + 1, i + 1); arrow[level] = -1; } } int main() { scanf("%d %d %d", &N, &M, &D); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { scanf("%d", &arr[i][j]); } } dfs(0, 0); printf("%d", ans); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 1003번 - 피보나치 함수 (C++) (0) | 2022.09.03 |
---|---|
[ 백준 ] 16234번 - 인구 이동 (C++) (0) | 2022.09.02 |
[ 백준 ] 16637번 - 괄호 추가하기 (C++) (0) | 2022.08.31 |
[ 백준 ] 2178번 - 미로 탐색 (C++) (0) | 2022.08.30 |
[ 백준 ] 11400번 - 단절선 (C++) (0) | 2022.08.29 |