-
백준 - 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); }
반응형'쾌락없는 책임 (공부) > 알고리즘 문제풀이' 카테고리의 다른 글
0/1 냅색 문제 풀이하기 (0) 2021.01.14 VS Code로 윈도우에서 케이크처럼 쉽게 C/C++을 하는 법 (0) 2021.01.09 백준 9095, 10819 (0) 2021.01.05 백준 1476, 1107 (C++) (0) 2021.01.04 백준 2751 Merge Sort, QuickSort, HeapSort (0) 2021.01.01