1033The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.
1733
3733
3739
3779
8779
8179
3 1033 8179 1373 8017 1033 1033
6 7 0
分析: node
本題主要是爲了找到路線的最短長度,但並不要求完整路徑,並且DFS方法可能會產生指數型時間複雜度的操做數,明顯應該使用BFS方法。可是,要注意到本題的一些陷阱,改變單個位置的數字產生的中間數以及初始數可能會大於結果要求的數字,因此要每位從零到九變化而且不包括原先未變化的數字。固然必須保證獲得的數字都是真正的四位數。剩餘要注意的就是篩法素數表和取特定位置數字,再也不詳述。 ios
代碼: git
// Problem#: 1444 // Submission#: 1858029 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ // All Copyright reserved by Informatic Lab of Sun Yat-sen University #include <iostream> #include <cstring> #include <queue> using namespace std; #define MAX 10000 #define DEBUG 1 bool isprime[MAX]; bool visit[MAX]; struct node{ int value; int step; node( int a, int b ){ value = a; step = b; } }; int pos[5] = {1,10,100,1000,10000}; void sieve(){ memset(isprime,true,sizeof(isprime)); isprime[0] = isprime[1] = false; for( int i=2 ; i<=100 ; i++ ) for( int j=i ; i*j<=MAX ; j++ ) if( isprime[i] ) isprime[i*j] = false; } inline int digit( int a, int n ){ return (a % pos[n]) / pos[n-1]; } void bfs( int a, int b ){ queue<node> buffer; buffer.push(node(a,0)); memset(visit,false,sizeof(visit)); visit[a] = true; while( !buffer.empty() ){ node tmp = buffer.front(); buffer.pop(); if( tmp.value==b ){ cout << tmp.step << endl; return ; } for( int i=3 ; i>=0 ; i-- ){ node next = tmp; next.step++; int temp = next.value - digit(next.value,i+1) * pos[i]; for( int j=0 ; j <= 9 ; j++ ){ next.value = temp + j*pos[i]; if( next.value==tmp.value || next.value<1000 ) continue; if( isprime[next.value] && !visit[next.value] ){ buffer.push(next); visit[next.value] = true; } } } } cout << "Impossible" << endl; } int main(){ sieve(); int n,a,b; cin >> n; while(n--){ cin >> a >> b; bfs(a,b); } return 0; }