Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
这题就是一个简单的bfs,附我的代码:#include"iostream" #include"queue" using namespace std; int is_prime[10000];/*prime[i]为1则说明i为素数*/ int visited[10000]; int end;/*最终要转化到的素数*/ int num[10000];//转化次数 void bfs(int i) { int j,k; queue<int>x; x.push(i); while(x.size()!=0) { int t=x.front();//取队首元素 visited[t]=1; x.pop();//出队 if(t==end) return; /*改变四位中的一位,即每个根结点有四个子子结点*/ for(j=0;j<4;j++) { char ch[5]; sprintf(ch,"%d",t);//将整数t转化为字符串存于ch中 for(k=0;k<10;k++)/*改变每一位有十种可能*/ { if(j==0&&k==0)/*最高位为0时,不能考虑,题中要求是四位数*/ continue; int temp; if(j==0) temp=k*1000+(ch[1]-'0')*100+(ch[2]-'0')*10+(ch[3]-'0'); else if(j==1) temp=k*100+(ch[0]-'0')*1000+(ch[2]-'0')*10+(ch[3]-'0'); else if(j==2) temp=k*10+(ch[0]-'0')*1000+(ch[1]-'0')*100+(ch[3]-'0'); else if(j==3) temp=k+(ch[0]-'0')*1000+(ch[1]-'0')*100+(ch[2]-'0')*10; if(is_prime[temp]&&visited[temp]==0&&temp<10000)/*是素数且未被访问且在四位数之内*/ { num[temp]=num[t]+1;//递归求解 x.push(temp);//入队 visited[temp]=1;//标记 } } } } } int main() { int N; int i,j; /*求10000内素数*/ for(i=0;i<10000;i++) is_prime[i]=1; is_prime[0]=0;/*0和1不是素数*/ is_prime[1]=0; for(i=2;i<10000;i++)//从2开始 for(j=2;i*j<10000;j++)/*i*j不能越过10000*/ is_prime[i*j]=0; scanf("%d",&N); while(N--) { int begin; memset(visited,0,sizeof(visited));//初始化 memset(num,0,sizeof(num)); scanf("%d%d",&begin,&end); bfs(begin);//遍历 if(num[end]==0&&begin!=end)/*不能找到合适的*/ printf("Impossible\n"); else printf("%d\n",num[end]); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator