상세 컨텐츠

본문 제목

백준 1697 숨바꼭질 (C++)

baekjoon

by nownow 2024. 2. 18. 03:05

본문

https://www.acmicpc.net/problem/1697

dp 문제라고 생각하고 풀다가 답이 안나와서 분류를 봤다.

bfs로 풀 수 있는 문제였다.

이런느낌으로 연결된 그래프를 연상했다.

dfs로 사용하면 모든 경우를 끝까지 가봐서 가장 작은 것을 선택 해야 겠지만

bfs를 사용 시에 같은 횟수로 먼저 도착했을 때 가장 최소 비용을 사용했다고 확인할 수 있으니 bfs를 사용.

#include <iostream>
#include <algorithm>
#include <vector>
#include<cstring>
#include<queue>
#include<cmath>
struct forq {
	int num;
	int count;
};
using namespace std;
bool check[100005];
int linenum, verticenum;
int subin, sister;
void bfs(int start);
int main()
{
	cin >> subin >> sister;
	memset(check, 0, sizeof(check));
	bfs(subin);
}
void bfs(int start)
{
	queue<forq> q;
	q.push({ start,0 });
	check[start] = 1;
	while (!q.empty())
	{
		forq temp = q.front();
		if (temp.num == sister)
		{
			cout << temp.count;
			return;
		}
		q.pop();
		if (temp.num - 1 >= 0 && check[temp.num-1]==0 )
		{
			q.push({ temp.num - 1,temp.count + 1 });
			check[temp.num-1] = 1;
		}
		if (temp.num + 1 <= 100000 && check[temp.num + 1] == 0)
		{
			q.push({ temp.num +1 ,temp.count + 1 });
			check[temp.num + 1] = 1;
		}
		if (temp.num * 2 <= 100000 && check[temp.num * 2] == 0)
		{
			q.push({ temp.num * 2,temp.count + 1 });
			check[temp.num *2] = 1;
		}

	}
}

 

처음에는  main에서 모든 정점에 대해 +1, -1, *2가 가능 하다면 인접리스트로 모든 간선을 넣어 주었지만

그렇지 않아도 해결할 수 있는 상황이 더 효율적이었기에 위와 같이 구현했다.

'baekjoon' 카테고리의 다른 글

백준 6603 로또 (c++/백트래킹)  (0) 2024.02.26
백준 1759 암호 만들기 (C++)  (0) 2024.02.19
백준 1932 정수삼각형 (C++)  (0) 2024.02.17
백준 11726 2xn 타일링(C++)  (0) 2024.02.17
백준 9095 - 1, 2, 3 더하기 (C++)  (0) 2024.02.16

관련글 더보기