广度优先搜索算法
我以前做的一个光搜题,给你贴上吧,是一个关360问答于素数变化的题目,输入一对素数,每个是4或制位数,每次只能变化一位数,且变化后的数还是素数,求经过多少次变化,能变成另一个输入的素数。程序有点复杂,慢慢看吧。
#include<iostream>
#include<cmath>
using namespace std;
int temp,temp2,i,j;
int f(int t)
temp2 = sqrt(float(t))+1;
for(j=2;j<temp2;++j)
if(t%j==0)
r振胜用别都族响其乱曲怎eturn 0;
return 1;
i树贵宪课因nt main()
int prime[10000],qu[20000],res却拉能究日士此ult,k,h,num,tag[10000],sum,index,itag,d[10过思伤束坏000],atag;
while(1)
for(花员迅投法始投则克i = 1000;i<10000;++i) {tag[i] = 0,d[i]=0;}
cin>>num>>result;
k=0;h=1高达史教缩;qu[k]=num;index=0;itag=1;tag[num]=1;atag=0;
while(k!=h)
if(qu[k] == result)
{cout<<d[qu[k]]<<endl;break;}
if(qu[k]%2==0) continue;
temp=qu[k]老者火假重展动者-qu[k]%10+1;
f船红十茶另科试小针既互or(i=0;i<5与裂磁个跳沿率年把初问;i++,tem苗点五等造形p+=2)
if(f(t须断带拿因增此空评蛋emp)==1&&tag[temp]==0)
{tag[temp]=1;d[temp]=d[qu[丰新粉系推旧静配倍k]]+1;qu[h]=temp;
if(temp==result){cout<<d[temp]<<endl;atag=1;break;}++h;备际建良}if(atag==1) break;
temp=qu[k]-qu[k]%100/10*10;
for(i=0;i<10;++i,temp+=10)
if(f(temp)==1&&tag[temp]==0)
{t排丰了病即硫据装功北ag[temp]=1;d[temp]=d明朝湖英[qu[k]]+1;qu[h]=temp;
if(temp==result){c解用金跳宁钢态随减兵out<<d[temp]<<endl;atag=1;break;}++h;}if(atag==1) b燃力缺顶混端消煤reak;
temp=qu[k]-qu[k]%1000/100*100;
for(i=0;i<10;++i,temp+=100)
if(f(temp)==1&&tag[temp]==0)
{tag[temp]=1;d[temp]=d[qu[k]]+1;qu[h]=temp;
if(temp==result){cout<<d[temp]<<endl;atag=1;break;}++h;}if(atag==1) break;
temp=qu[k]-qu[k]/1000*1000+1000;
for(i=0;i<8;++i,temp+=1000)
if(f(temp)==1&&tag[temp]==0)
{tag[temp]=1;d[temp]=d[qu[k]]+1;qu[h]=temp;
if(temp==result){cout<<d[temp]<<endl;atag=1;break;}++h;}if(atag==1) break;
++k;
return 1;