* 정답 경우의수 구하기 핵심코드
for (int next : {now - 1, now + 1, now * 2}) {
//1. 범위체크
if (next >= 0 && next <= 100000)
{
//최초방문인경우
if (!visited[next]) {
visited[next] = visited[now] + 1;
cnt[next] += cnt[now];
q.push(next);
}
//두번째이상방문 and 최단거리방문인경우
else if (visited[next] == visited[now] + 1) {
cnt[next] += cnt[now];
}
}
}
1. 경우의수는 덧셈으로 구현하라.
2. 맨 아래의 경우는 반영안되도록 최단거리체크 추가.
#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], cnt[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.초기화 cnt[n] = 1;
* 2.종료조건
* 3.next 범위체크
* 4.next 방문체크
* 5.visit[next] 갱신
* 5.1 q.push!!
* 6.추가논리(cnt[next]+=cnt[now])
*/
queue<int> q;
q.push(n);
visited[n] = 1;
cnt[n] = 1;
bool flag = 0;
while (q.size())
{
int now = q.front(); q.pop();
for (int next : {now - 1, now + 1, now * 2}) {
//1. 범위체크
if (next >= 0 && next <= 100000)
{
//최초방문인경우
if (!visited[next]) {
visited[next] = visited[now] + 1;
cnt[next] += cnt[now];
q.push(next);
}
//두번째이상방문 and 최단거리방문인경우
else if (visited[next] == visited[now] + 1) {
cnt[next] += cnt[now];
}
}
}
}
cout << visited[k] - 1 << "\n" << cnt[k];
}
/*
5 17
*/
'Algorithm > boj' 카테고리의 다른 글
백준 3197 백조의 호수 // bfs멈춰는 tempQ, 1차원에서 논리짜라, next경우의수를 나눠서 처리하라, pair Q 클리어하는법 (1) | 2023.06.13 |
---|---|
백준 14497 주난의 난// bfs멈춰는 큐2개로 해결, 어려우면 1차원에서 논리를 짜라 (0) | 2023.06.12 |
백준 13913 // bfs 경로추적은 prev[next]=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 |