您的位置:首页 > 其它

day6 POJ 3126 Prime Path

2016-08-02 23:30 162 查看
求解两个素数之间最小的变换,每次只能变动一个数字并且变动后必须为素数。

BFS的本质是搜索当前状态改变一次所能到达的所有状态,那么只需要枚举四个数字每个数字的变化并且进行搜索就可以了

这里注意一个点,在写判断素数的函数的时候 i<=sqrt(x) 我漏掉了=号 这样就会让很多数字判断错误结果WA了很多次  细节还是要多注意

#include"iostream"
#include"queue"
#include"cmath"
using namespace std;
queue<int>q;

int st,ed;

int v[10000];

int prime(int x)
{
if(x==2||x==3) return 1;
if(x<=1||x%2==0) return 0;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0) return 0;
return 1;
}
void BFS(int st,int y)
{

while(!q.empty()) q.pop();
q.push(st);
while(!q.empty())
{

int x=q.front();
//cout<<w<<endl;
//cout<<endl;
if(x==y) {cout<<v[x]<<endl; return;}
int w;
q.pop();
//int k=x/10;
for(int i=1;i<10;i+=2)
{
w=x/10*10+i;

if(w!=x&&prime(w)&&v[w]==-1)
{

v[w]=v[x]+1;
q.push(w);

}
}

// k=x/100; int m=x%10;
for(int i=0;i<10;i++)
{
w=x/100*100+i*10+x%10;

if(w!=x&&prime(w)&&v[w]==-1)
{
v[w]=v[x]+1;
q.push(w);

}
}

//k=x/1000; m=x%100;
for(int i=0;i<10;i++)
{
w=x/1000*1000+i*100+x%100;

if(w!=x&&prime(w)&&v[w]==-1)
{

v[w]=v[x]+1;
q.push(w);

}
}
//m=x%1000;
for(int i=1;i<10;i++)
{
w=i*1000+x%1000;

if(w!=x&&prime(w)&&v[w]==-1)
{
v[w]=v[x]+1;
q.push(w);

}
}

}
cout<<"Impossible"<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>st>>ed;
for(int i=0;i<10000;i++) v[i]=-1;
v[st]=0;
BFS(st,ed);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: