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; }