ns-3中隨機數機制
阿新 • • 發佈:2020-08-10
原題連結
題解
題目的意思是給你兩個素數a,b,問你每次只能改變一個數字a-->b的素數路徑最小是多少。先利用素數篩把素數10000以內的素數選出來,方便計算。然後直接利用BFS列舉所有的情況。
程式碼如下
#include <iostream> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 10010; int judge[N] = {1, 1}; int prime[N]; int numprime = 0; int st[N]; void init(){ for(int i = 2; i < N; ++ i){ if(judge[i] == 0) prime[numprime ++] = i; for(int j = 0; j < numprime && i * prime[j] < N; ++ j){ judge[i * prime[j]] = 1; if(i % prime[j] == 0) break; } } } int changed(int num, int op, int temp){ int ans = 0; if(op == 0) ans = num % 1000 + temp * 1000; else if(op == 1) ans = num / 1000 * 1000 + num % 100 + temp * 100; else if(op == 2) ans = num / 100 * 100 + temp * 10 + num % 10; else ans = num / 10 * 10 + temp; return ans; } int main(){ init(); int T; cin >> T; while(T --){ memset(st, -1, sizeof st); int n, m; cin >> n >> m; queue<int> q; q.push(n); st[n] = 0; int res = -1; while(q.size()){ int t = q.front(); q.pop(); if(t == m) {res = st[t]; break;} for(int i = 0; i < 4; ++ i){ for(int j = 0; j <= 9; ++ j){ if(i == 0 && j == 0) continue; int temp = changed(t, i, j); if(st[temp] == -1 && judge[temp] == 0) q.push(temp), st[temp] = st[t] + 1; } } } if(res == -1) cout << "Impossible" << '\n'; else cout << res << endl; } return 0; }