작성
·
212
0
제가 2일 동안 고민해봤고 선생님의 논리와 같은 거 같은데 왜 안 풀리는지 모르겠습니다.
숨바꼭질2에서는 답이 잘 나와서 확인 해봤는데
(방금 고민하면서 문제 풀어버렸습니다. 그렇지만 질문은 있습니다.)
//cout << s <<" "; 이거 있는 부분을 해제하고 실행하면 괴상한 수를 잔뜩 거쳐서 목적지로 가더라고요.
이거 제 머리속에 있는 bfs 논리로는 괴상한 수들을 거칠 이유가 없습니다.
또
우선 dfs를 이용해서 경로 추적할 수 있을 거 같은데 그 방향은 안 되는 건가요?
#include<bits/stdc++.h>
using namespace std;
#define INF 987654321
int n, k, ret = INF, cnt;
const int jump[] = {-1, 1, INF};
int visited[100004];
int parent[100004];
void printPath(int i){
if(parent[i] == -1){
return;
}
printPath(parent[i]);
cout << i << " ";
}
void bfs1D(int s){
visited[s] = 1;
queue<int> q;
q.push(s);
int ns =-1;
parent[s] = -1;
while(!q.empty()){
int here = q.front(); q.pop();
//cout << s << " ";
if(here==k){
cnt++;
ret = visited[here]-1;
break;
}
for(int i=0;i<3;i++){
if(i==2){
ns = 2*here;
}else{
ns = here + jump[i];
}
if(ns <0 || ns >100000) continue;
if(visited[ns]==0){
visited[ns] = visited[here]+1;
q.push(ns);
parent[ns] = here;
}
}
}
cout << ret << '\n';
cout << s << " ";
printPath(k);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >>k;
bfs1D(n);
}
답변 1
0
안녕하세요. RokiePlayer님 ㅎㅎ
1. //cout << s <<" "; 이거 있는 부분을 해제하고 실행하면 괴상한 수를 잔뜩 거쳐서 목적지로 가더라고요.
이거 제 머리속에 있는 bfs 논리로는 괴상한 수들을 거칠 이유가 없습니다.
>> 이거 디버깅이 잘못되었습니다. 아래 코드 처럼 디버깅하셔야 합니다.
while(!q.empty()){
int here = q.front(); q.pop();
cout << here << " ";
즉, s가 아니라 here을 중심으로 디버깅하셔야 합니다. :)
5 17
5 4 6 10 3 8 7 12 9 11 20 2 16 14 13 24 18 22 19 21 40 1 15 17 4
5 4 8 16 17
위 코드를 돌리면 이렇게 나오는데 이는 괴상한 수는 아니죠?
2. 우선 dfs를 이용해서 경로 추적할 수 있을 거 같은데 그 방향은 안 되는 건가요?
>> dfs도 가능합니다. 잘 짜셨어요. trace할 때는 항상 dfs로 하던가 아니면 for 루프 사용해서 하던가 해야 합니다. :)
또 질문사항있으시면 언제든 말씀 부탁드립니다.
감사합니다.
강사 큰돌 올림.