* bfs 경로추적 핵심코드
prev[10]=5 // prev[5]=3 .. 이런식으로 연결함.
ex)
노드 : 5-10-11(목표k)
벡터 : 11(k)-10(prev[11]).
문제 : 첫노드는 안들어감 ,역순으로 넣어짐
해결 : push(start), 리버스
for (int next : {now - 1, now + 1, now * 2}) {
//1. 범위체크
if (next >= 0 && next <= 100000)
{
if (visited[next]) continue;
visited[next] = visited[now] + 1;
prev[next] = now;
q.push(next);
vector<int> v;
for (int i = k; i != n; i = prev[i]) {
v.push_back(i);
}
v.push_back(n); //처음노드는 직접넣어줘야댐
reverse(v.begin(), v.end()); //v.reverse아님.
#include <bits/stdc++.h>
#define prev aaa
#define next aaaa
using namespace std;
int ret1,ret2;
int n, k,dx[4] = { -1,0,1,0 }, dy[4] = { 0,-1,0,1 };
int visited[100004], prev[100004];
vector<pair<int, int>> v;
#define MAX 100000
bool in(int a, int b) {
return 0 <= a && a < n && 0 <= b && b < n;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n>>k ;
/*
* bfs algorithm
* 1.초기화
* 2.종료조건
* 3.next 범위체크
* 4.next 방문체크
* 5.visit[next] 갱신
* 5.1 q.push!!
* 6.추가논리(prev[next]=now)
* prev[10]=5 //10의 이전노드는 5이다.
*/
queue<int> q;
q.push(n);
visited[n] = 1;
bool flag = 0;
while (q.size())
{
int now = q.front(); q.pop();
if (now == k) { //종료조건 for밖에서 해야? ㅇㅇ
ret1 = visited[now];
break;
}
for (int next : {now - 1, now + 1, now * 2}) {
//1. 범위체크
if (next >= 0 && next <= 100000)
{
if (visited[next]) continue;
visited[next] = visited[now] + 1;
prev[next] = now;
q.push(next);
//if (next == k) { ret1 = visited[next]; flag = 1; }
//if (flag) break;
}
}
//if (flag) break;
}
vector<int> v;
for (int i = k; i != n; i = prev[i]) {
v.push_back(i);
}
v.push_back(n); //처음노드는 직접넣어줘야댐
reverse(v.begin(), v.end()); //v.reverse아님.
cout << ret1-1<<"\n";
for (auto i : v) { cout << i << " "; }
}
/*
5 17
*/
'Algorithm > boj' 카테고리의 다른 글
백준 14497 주난의 난// bfs멈춰는 큐2개로 해결, 어려우면 1차원에서 논리를 짜라 (0) | 2023.06.12 |
---|---|
백준 12851 // bfs암기, 정답 경우의수 구하기는 cnt[next]+=cnt[here] (0) | 2023.06.09 |
백준 12869 //visit[체력][체력][체력]=최단거리(공격횟수) /visit idx를 체력으로 사용하라. (0) | 2023.06.02 |
백준 16234 인구이동 // ny,nx만처리하는 bfs / main에서 v[y][x]처리 / vector &v로 함수내 전역변수 사용 (1) | 2023.06.01 |
백준 4179 // 갈수있는지조사는 bfs visit 비교 (0) | 2023.05.31 |