[백준/BOJ] 백준 12761번 : 돌다리

2020. 8. 18. 08:40알고리즘 문제풀이

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

 

12761번: 돌다리

동규와 주미는 일직선 상의 돌 다리 위에있다. 돌의 번호는 0 부터 100,000 까지 존재하고 동규는 \(N\)번 돌 위에, 주미는 \(M\)번 돌 위에 위치하고 있다. 동규는 주미가 너무 보고싶기 때문에 최대��

www.acmicpc.net

이동할 수 있는 8가지 방법을 고려하여 목적지까지 이동 횟수의 최솟값을 구한다

 

코드

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;

int a, b, n, m;
int discovered[100001];
int depth[100001];
int d[8] = { -1,1,0,0,0,0,0,0 };

int Solve(int start, int dest)
{
	discovered[start] = 1;
	depth[start] = 0;

	queue<int>q;
	q.push(start);

	while (!q.empty())
	{
		int here = q.front();
		q.pop();

		//목적지에 도착 했을때
		if (here == dest)
			return depth[here];

		for (int i = 0; i < 8; i++)
		{
			int there;

			if (i == 6 || i == 7)
				there = here * d[i];

			else
				there = here + d[i];

			if (there >= 0 && there <= 100000 && discovered[there] == 0)
			{
				discovered[there] = 1;
				depth[there] = depth[here] + 1;

				q.push(there);
			}
		}
	}

	return -1;
}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	memset(discovered, 0, sizeof(discovered));
	memset(depth, 0, sizeof(depth));

	cin >> a >> b >> n >> m;

	d[2] = -a;
	d[3] = a;
	d[4] = -b;
	d[5] = b;
	d[6] = a;
	d[7] = b;

	cout << Solve(n, m);

	return 0;
}