(BFS11.1.1)POJ 3126 Prime Path(計算從初始素數到目標素數的最短路徑長度)
阿新 • • 發佈:2019-02-15
/* * POJ_3126.cpp * * Created on: 2013年11月7日 * Author: Administrator */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; struct node{ int k;//當前素數 int step;//路徑長度 }; node h[100000];//佇列 int p[10010];//素數表 /** * x: 初始素數 * y: 目標素數 * s[x] = a: 到達素數x的最短路徑為a */ int x,y,tot,s[10010]; void make(int n){//產生素數表 memset(p,0,sizeof(p)); p[0] = 1; p[1] = 1; int i,j; for(i = 2 ; i <= n ; ++i){ if(!p[i]){ for(j = i*i ; j <= n ;j += i){ p[j] = 1; } } } } int change(int x,int i,int j){//將x的第i位改成j if(i == 1){ return (x/10)*10 + j; }else if(i == 2){ return (x/100)*100 + x%10 + j*10; }else if(i == 3){ return (x/1000)*1000 + x%100 + j*100; }else if(i == 4){ return (x%1000) + j*1000; } } int main(){ make(9999); scanf("%d",&tot); while(tot--){ scanf("%d%d",&x,&y); h[1].k = x; h[1].step = 0; int l = 1; int r = 1; memset(s,100,sizeof(s));//一開始將到達一個素數的路徑設成一個很大的值 int ans = -1; while(1){ if(h[l].k == y){//如果當前素數 == 目標素數 ans = h[l].step; break; } /** * tk: 當前素數 * ts: 到達素數tk的路徑長度 */ int tk,ts; int i,j; for(i = 1 ; i <= 4 ; ++i){//搜尋每一種情況 for(j = 0 ; j <= 9 ; ++j){ if(!(j == 0 && i == 4)){ tk = change(h[l].k,i,j); if(p[tk]){ continue; } ts = h[l].step + 1; if(ts >= s[tk]){ continue; } if(tk == y){ ans = ts; break; } s[tk] = ts; r++; h[r].k = tk; h[r].step = ts; } } } if(l == r || ans >= 0){//如果佇列空||得到目標素數 break; } l++;//隊首元素真正出隊 } if(ans >= 0){ printf("%d\n",ans); }else{ printf("Impossible\n"); } } return 0; }