본문 바로가기

알고리즘/백준

백준 1963 소수 경로

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

 

1963번: 소수 경로

문제 소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데: “이제 슬슬 비번 바꿀 때도 됐잖아” “응

www.acmicpc.net

bfs와 그리디하게 풀면 된다.

 

요즘 고급 알고리즘 공부를 많이 접하다보니까 이 문제를 특정 알고리즘으로 풀려다가 시간을 많이 날렸다...

 

밸런스가 중요한 것 같다. 

 

/* 소수 경로 */

#include <iostream>
#include <string>
#include <algorithm>
#include <queue>
#include <cstring>

#define INTMAX 10000 + 1

using namespace std;

string a, b;
int check[INTMAX];
bool decimal[INTMAX];

void input();
void solve();

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

	int ttt; cin >> ttt;

	for (int t_case = 0; t_case < ttt; t_case++) {
		memset(check, -1, sizeof(check));
		memset(decimal, true, sizeof(decimal));
		input();
		solve();
	}

	return 0;
}

void input() {
	cin >> a >> b;
}

void eratos() {
	decimal[1] = decimal[0] = false;

	for (int i = 2; i < INTMAX; i++) {
		if (decimal[i] == false)
			continue;

		for (int j = 2; i * j < INTMAX; j++) {
			decimal[i * j] = false;
		}
	}
}

void solve() {
	check[(int)stoi(a)] = 0;

	int depth = 0;
	eratos();

	queue<string> q;
	q.push(a);

	while (!q.empty()) {
		string cur = q.front();
		q.pop();
	
		for (int here = 0; here < 4; here++) {
			for (int to = 0; to < 10; to++) {
				string nxt = cur;
				nxt[here] = to + '0';

				if (nxt.compare(cur) == 0)
					continue;

				if (stoi(nxt) >= 1000 && check[stoi(nxt)] == -1 &&
					decimal[stoi(nxt)] == true) {
					check[stoi(nxt)] = check[stoi(cur)] + 1;

					q.push(nxt);
				}

			}
		}
	}

	cout << check[stoi(b)] << '\n';
}

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 2437 저울  (0) 2020.08.23
백준 13913 숨바꼭질 4  (0) 2020.08.23
백준 11438 LCA2  (0) 2020.08.23
백준 1949 우수 마을  (0) 2020.08.23
백준 3109 빵집  (0) 2020.08.22