POJ3126 BFS

这题。。。。一次就A了。有点太水了。其中本来还觉得就判断质数比较耗时。

其实只要先制成一张质数的表。每次去查就行了。耗时就小了。

#include<iostream>

#include<math.h>
#include<queue>
using namespace std;
int data,target;
bool prime[10005]; 
int visit[10005];
bool isprime(int t)
{
     for(int i=2;i<=sqrt(double(t));i++)
             if(t%i==0)
                       return false;
     return true;
     
}
void makejudge()
{
    for(int i=1000;i<=9999;i++)
    prime[i]=isprime(i);            
}
void bfs()
{
     queue<int> que;
     que.push(data);
     visit[data]=1;
     while(!que.empty())
     {
            int now=que.front();
            que.pop();
            if(now==target)
            {
                           printf("%d\n",visit[now]-1);
                           return;
            }
            for(int i1=1;i1<=9;i1++)
            {
                    int t1=((now/1000+i1)%10)*1000+now%1000;
                    if(t1/1000==0)
                                  continue;
                    if(prime[t1]&&!visit[t1])
                    {
                    que.push(t1);
                    visit[t1]=visit[now]+1;
                    //break;
                    }
            }
            for(int i2=1;i2<=9;i2++)
            {
                    int t2=((((now/100)%10)+i2)%10)*100+(now/1000)*1000+now%100;
                    if(prime[t2]&&!visit[t2])
                    {
                    que.push(t2);
                    visit[t2]=visit[now]+1;
                    //break;
                    }
            }
            for(int i3=1;i3<=9;i3++)
            {
                    int t3=((((now/10)%10)+i3)%10)*10+(now/1000)*1000+((now/100)%10)*100+now%10;
                    if(prime[t3]&&!visit[t3])
                    {
                    que.push(t3);
                    visit[t3]=visit[now]+1;
                    //break;
                    }
            }
            for(int i4=1;i4<=9;i4++)
            {
                    int t4=((now%10)+i4)%10+now-(now%10);
                    if(prime[t4]&&!visit[t4])
                    {
                    que.push(t4);
                    visit[t4]=visit[now]+1;
                    //break;
                    }
            }
                 
     }
     printf("Impossible\n");
     
}
int main()
{
    //freopen("C:\\Users\\wuyanyisb\\Desktop\\1.txt","r",stdin);
    int cases;
    scanf("%d\n",&cases);
    makejudge();
    while(cases--)
    {
         scanf("%d %d\n",&data,&target);
         memset(visit,0,sizeof(visit));
         bfs();                      
    }
    system("pause");
    return 0;
}
posted on 2011-07-21 23:23  不是我干的  阅读(173)  评论(0)    收藏  举报