ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 - 1697, 10971
    쾌락없는 책임 (공부)/알고리즘 문제풀이 2021. 1. 6. 19:04
    반응형

    1697 : www.acmicpc.net/problem/1697

    #include <iostream>
    #include <queue>
    using namespace std;
    #define max 100001
    bool isVisited[max];  // 방문한 곳을 다시 방문할 필요가 없으니 체크하기 위한 배열 (default : false)
        int N, K;
    int search(int N, int K) {
        int count = 0;      // 몇번만에 만났는지 체크할 변수
        queue<int> q;
        q.push(N);      // 일단 자기 위치 넣어줌
    
        while(true){    //계속 돌게하고 탈출 조건인 N = K를 안에 넣음
            int n = q.size();
            for(int i = 0; i < n; i++){
    
                N = q.front();
                q.pop();
    
                if(N == K)  // 완료조건
                    return count;
                if (N > 0 && isVisited[N-1] == false){
                    q.push(N-1);
                    isVisited[N-1] = true;
                }
                if (N < 100001 && isVisited[N+1] == false){
                    q.push(N+1);
                    isVisited[N+1] = true;
                }
                if (2*N < 100001 && isVisited[N*2] == false){
                    q.push(N*2);
                    isVisited[N*2] = true;
                }
            }
            count++;    //이번 레벨에서 없었으니 다음 레벨로
        }
    
    }
    int main(){
    
        scanf("%d %d", &N, &K);
        printf("%d", search(N,K));
    }
    

    10971 : www.acmicpc.net/problem/10971

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main(){
        int N;
        int arr[11][11];
        int minCost = 2147483647;
    
        scanf("%d", &N);
    
        int city[10];   // 도시 최대 수가 10이다
        for(int i = 0; i < N; i++)
            city[i] = i+1;
        
        for(int i = 1; i <= N; i++)
            for(int j = 1; j <= N; j++)
                scanf("%d", &arr[i][j]);
        
        // can 변수는 못가는 도시가 있었는지를 탐색 > 한 도시라도 못갔다면 비교를 안할 예정
        do {
            int cost = 0;
            bool can = true;
    
            for(int i = 0; i < N-1; i++){
                if(arr[city[i]][city[i+1]] == 0){   // 갈 수 없다
                    can = false;
                    break;
                }else{
                    cost += arr[city[i]][city[i+1]];
                }
            }
    
            if(can && arr[city[N-1]][city[0]] != 0){    // 마지막으로 원래대로 돌아갈 수 있는지
                cost += arr[city[N-1]][city[0]];
                minCost = min(minCost, cost);
            }
    
        } while (next_permutation(city, city+N));     // 도시를 방문하는 가짓수를 순열 생성기로 만듬
    
    
        printf("%d\n", minCost);
    }
    반응형

    댓글

Designed by Tistory.