http://poj.org/problem?id=3126
搜索的时候注意
1:首位不能有0
2:可以暂时有没有出现在目标数中的数字
#include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn=1e4+5; const int inf=0x7fffffff; bool prim[maxn]; void judge(){ prim[2]=true; for(int i=3;i<maxn;i+=2)prim[i]=true; for(int i=3;i<maxn;i+=2){ if(prim[i]){ for(int j=3;j*i<maxn;j+=2){ prim[j*i]=false; } } } } int dp[maxn],s,e; queue<int> que; const int base[4]={ 10,100,1000,10000 }; int change(int sta,int ind,int num){ int sub=sta%(base[ind]); if(ind>0)sub-=sub%base[ind-1]; sta-=sub; sta+=num*base[ind]/10; return sta; } void cal(){ for(int i=0;i<maxn;i++)dp[i]=inf; while(!que.empty())que.pop(); dp[s]=0; que.push(s); while(!que.empty()){ int f=que.front();que.pop(); if(f==e)return ; for(int i=0;i<4;i++){ for(int j=0;j<10;j++){ if(i==3&&j==0)continue; int to=change(f,i,j); if(!prim[to]||dp[to]!=inf)continue; dp[to]=dp[f]+1; que.push(to); } } } } int main(){ int T; scanf("%d",&T); judge(); while(T--){ scanf("%d%d",&s,&e); cal(); printf("%d ",dp[e]); } }