반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 17135 캐슬 디펜스 본문

백준(Baekjoon) 문제

백준 17135 캐슬 디펜스

huiung 2019. 11. 10. 13:39
반응형

https://www.acmicpc.net/problem/17135

문제와 채점은 위 사이트에서 확인 하실 수 있습니다

 

이 문제는 적들이 주어진 맵에 존재하고 성벽에 궁수 3명이 있을때 궁수들의 위치를 배치하여 가장 적을 많이 처치 할 수 있는 수를 구하는 문제입니다. 모든 가능한 궁수들의 배치에 대하여 각각 시뮬레이션을 해보면 됩니다. 

 

주어진 조건에 따라 현재 제거할 수 있는 가장 가까운 적(거리가 가장가까운)들을 차례대로 제거하고 적들을 한칸씩 아래로 내리면서 더이상 적이 없을때까지 진행해주시면 됩니다. 저는 벡터에 적들의 좌표를 유지시키면서 풀었습니다.

 

다음은 코드입니다.

 

#include <iostream>
#include <vector>
#include <cmath>
#include <cstring>

using namespace std;

int N,M,D;
int ans;

int sol(int a, int b, int c, vector<pair<int, int> > v, int enemy) {
    if(v.size() == 0) //적이 없음
        return enemy;

    vector<pair<int, int> > vc = v;
    int d[3];
    int arc[3];
    arc[0] = a;
    arc[1] = b;
    arc[2] = c;
    d[0] = 100;
    d[1] = 100;
    d[2] = 100;
    int pos[3];
    memset(pos, -1, sizeof(pos));

    for(int i = 0; i < vc.size(); i++) {
        for(int j = 0; j < 3; j++) {
            int dd = abs(vc[i].first-N)+abs(vc[i].second-arc[j]);
            if(d[j] >= dd) {
                if(d[j] == dd) { // 거리가 같은경우 왼쪽 좌표를 비교하여 판단
                    if(vc[pos[j]].second > vc[i].second)
                        pos[j] = i;
                }
                else {
                    pos[j] = i;
                }
                d[j] = dd;
            }
        }
    }

    for(int i = 0; i < 3; i++) { // 궁수에게 제거당한 적 표시
        if(vc[pos[i]].first != -1 && d[i] <= D) {
            vc[pos[i]].first = -1;
            vc[pos[i]].second = -1;
            enemy++;
        }
    }
    vector<pair<int, int> > p;
    for(auto n : vc) { // 남은 적들 아래로 한칸씩 이동
        if(n.first != -1 && n.first+1 < N) {
            p.push_back({n.first+1, n.second});
        }
    }
    return sol(a, b, c, p, enemy);
}

int select(vector<pair<int, int> > v) { // 가능한 궁수의 조합
    for(int i = 0; i < M; i++)
        for(int j = i+1; j < M; j++)
            for(int k = j+1; k < M; k++) {
                ans = max(ans, sol(i,j,k, v, 0));
            }
    return ans;
}

int main(void) {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    cin >> N >> M >> D;
    int maze[16][16];
    vector<pair<int, int> > v;
    for(int i = 0; i < N; i++)
        for(int j = 0; j < M; j++) {
            cin >> maze[i][j];
            if(maze[i][j] == 1)v.push_back({i,j}); //적 좌표 저장
        }
    cout<<select(v);
    return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 2618 경찰차  (2) 2020.01.19
백준 파이프 옮기기 2  (0) 2019.11.10
백준 12920 평범한 배낭2  (0) 2019.11.08
백준 10942 팰린드롬?  (0) 2019.11.07
백준 2248 이진수 찾기  (0) 2019.11.03