STUDY/Algorithm

[백준] 20208 진우의 민트초코우유 python(pypy), C++

sinawi95 2022. 1. 12. 16:23
728x90

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

 

20208번: 진우의 민트초코우유

첫번째 줄에 민초마을의 크기인 N과 진우의 초기체력 M, 그리고 민트초코우유를 마실때 마다 증가하는 체력의 양 H가 공백을 두고 주어진다. N, M, H는 모두 10보다 작거나 같은 자연수이다. 두번째

www.acmicpc.net

민트초코가 있는 곳을 방문하고 다시 돌아올수 있는지 사이클을 확인하는 문제이다. 

이때 집과 민트초코 혹은 민트 초코끼리의 거리가 현재 진우의 체력보다 같거나 높아야 다음 단계로 넘어갈수 있다.

 

민트초코가 있는 점을 저장하고 방문하는 순서를 완전 탐색으로 돌려서 찾으면 된다.

 

import sys; input = sys.stdin.readline
answer = 0
visit = None
mint_choco = None
start = None
def dfs(ind, M, H, last, total):
    global answer
    if ind != 0:
        tmp_dist = abs(last[0] - start[0]) + abs(last[1] - start[1])
        if tmp_dist <= M:
            answer = max(answer, total)
    if ind == len(mint_choco):
        return

    for i in range(len(mint_choco)):
        if visit[i]: continue
        tmp_dist = abs(last[0] - mint_choco[i][0]) + abs(last[1] - mint_choco[i][1])
        if M < tmp_dist: continue
        visit[i] = True
        dfs(ind + 1, M + H - tmp_dist, H, mint_choco[i], total + 1)
        visit[i] = False


def main():
    N, M, H = map(int, input().split())
    global visit, mint_choco, start
    mint_choco = []
    for i in range(N):
        tmp = list(map(int, input().split()))
        for j in range(N):
            if tmp[j] == 1:
                start = (i, j)
            elif tmp[j] == 2:
                mint_choco.append((i, j))
    visit = [False for _ in range(len(mint_choco))]
    # dfs(ind, M, H, last, total)
    dfs(0, M, H, start, 0)

    print(answer)


if __name__ == '__main__':
    main()
#include<iostream>
#include<vector>
#define max(x, y) (x < y) ? y : x
using namespace std;

int answer, H;
vector<pair<int, int>> mint_choco;
vector<bool> visit;
pair<int, int> start;

int abs(int x) {
   return (x < 0) ? -x : x;
}

int dist(pair<int, int> a, pair<int, int> b) {
   return abs(a.first - b.first) + abs(a.second - b.second);
}

void dfs(int ind, int M, pair<int,int> last, int total) {
   if (ind) {
      if (dist(last, start) <= M) {
         answer = max(answer, total);
      }
   }
   if (ind == mint_choco.size()) return;

   for (int i = 0; i < mint_choco.size(); i++)
   {
      if (visit[i]) continue;
      if (M < dist(last, mint_choco[i])) continue;
      visit[i] = true;
      dfs(ind + 1, M + H - dist(last, mint_choco[i]), mint_choco[i], total + 1);
      visit[i] = false;
   }
}

int main() {
   //ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
   int N, M, i, j, tmp;
   cin >> N >> M >> H;
   for (i = 0; i < N; i++)
   {
      for (j = 0; j < N; j++)
      {
         cin >> tmp;
         if (tmp == 1) {
            start.first = i;
            start.second = j;
         }
         else if (tmp == 2) {
            mint_choco.push_back(make_pair(i, j));
         }
      }
   }
   for (i = 0; i < mint_choco.size(); i++)
   {
      visit.push_back(0);
   }
   dfs(0, M, start, 0);
   cout << answer << '\n';
   return 0;
}

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 15644 구슬 탈출 3, python  (0) 2022.01.13
[백준] 15681 트리와 쿼리, python  (0) 2022.01.12
[백준] 1718 암호 python  (0) 2022.01.12
[백준] 9489 사촌 python  (0) 2022.01.11
[백준] 20365 블로그 2 python  (0) 2022.01.11