-
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091#include<iostream>#include<queue>#include<cstring>using namespace std;int tc;int a, b;bool d[10000];int dist[10000];int origin(int a, int b, int c, int d) {return (a * 1000 + b * 100 + c * 10 + d);}bool prime(int a) {for (int i = 2; i * i <= a; i++) {if (a % i == 0)return false;}return true;}int bfs(int a, int b) {queue<int> q;q.push(a);d[a] = true;while (!q.empty()) {a = q.front();if (a == b) {return dist[a];}int one = a % 10; int two = (a / 10)% 10;int three = (a / 100) % 10;int four = (a / 1000) % 10;q.pop();for (int i = 0; i < 10; i++) {int s = origin(four, three, two, i);if (!d[s] && prime(s)) {d[s] = true;dist[s] = dist[a] + 1;q.push(s);}}for (int i = 0; i < 10; i++) {int s = origin(four, three, i, one);if (!d[s] && prime(s)) {d[s] = true;dist[s] = dist[a] + 1;q.push(s);}}for (int i = 0; i < 10; i++) {int s = origin(four,i, two, one);if (!d[s] && prime(s)) {d[s] = true;dist[s] = dist[a] + 1;q.push(s);}}for (int i = 1; i < 10; i++) {int s = origin(i,three, two, one);if (!d[s] && prime(s)) {d[s] = true;dist[s] = dist[a] + 1;q.push(s);}}}return -1;}int main() {ios_base::sync_with_stdio(0);cin.tie(0);cin >> tc;for (int t = 0; t < tc; t++) {cin >> a >> b;int ans = bfs(a, b);if (ans == -1)cout << "Impossible" << '\n';elsecout << ans << '\n';memset(d, false, sizeof(d));memset(dist, false, sizeof(dist));}}http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
그냥 딱 예전에 풀어봤을법한 문제가아닐까 싶다
BFS개념자체는 그대로 적용되지만, 소수구할때 저렇게나마 줄이지않으면 분명히 시간초과가날것같은 문제다