POJ - 3126
需掌握
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=100000;
int is[N];
void isp(int n){
memset(is,0,sizeof(is));
for(int i=2;i<n;i++){
if(!is[i]){
if(i*i<n){
for(int j=i*i;j<n;j+=i){
is[j]=1;
}
}
}
}
}
int main(){
int n;
cin>>n;
isp(n);
}
代码
//广搜,每位数字都变,标记出现过的数字,bfs,素数筛
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int a,b;
int ans=0;
int p[10005];
struct node{
int data;
int steps;
};
int is[10005];
void isp(int n){//素数筛需重点掌握
memset(is,0,sizeof(is));
for(int i=2;i<n;i++){
if(!is[i]){
if(i*i<n){
for(int j=i*i;j<n;j+=i){
is[j]=1;
}
}
}
}
}
int dfs(){
queue<node> q;
node r;
r.data=a;
r.steps=0;
q.push(r);//将a的数据push进队列
p[a]=1;
while(!q.empty()){
node temp=q.front();
q.pop();
if(temp.data==b){//若相等返回第几步
return temp.steps;
}
node cnt;
for(int i=0;i<=9;i++){
cnt.data=temp.data/10*10+i;//将个位替换
if(!p[cnt.data]&&!is[cnt.data]){//判断是否出现过,且判断是否为素数
cnt.steps=temp.steps+1;
q.push(cnt);
p[cnt.data]=1;
}
}//个位
for(int i=0;i<=9;i++){
cnt.data=temp.data/100*100+i*10+temp.data%10;
if(!p[cnt.data]&&!is[cnt.data]){
cnt.steps=temp.steps+1;
q.push(cnt);
p[cnt.data]=1;
}
}//十位
for(int i=0;i<=9;i++){
cnt.data=temp.data/1000*1000+i*100+temp.data%100;
if(!p[cnt.data]&&!is[cnt.data]){
cnt.steps=temp.steps+1;
q.push(cnt);
p[cnt.data]=1;
}
}//百位
for(int i=1;i<=9;i++){
cnt.data=temp.data%1000+i*1000;
if(!p[cnt.data]&&!is[cnt.data]){
cnt.steps=temp.steps+1;
q.push(cnt);
p[cnt.data]=1;
}
}
}//千位
return 0;
}
int main(){
int n;
cin>>n;
isp(10001);//标记素数为0;
while(n--){
cin>>a>>b;
memset(p,0,sizeof(p));//标记出现过的数字为1,在此处重置
int t=dfs();
cout<<t<<endl;}
}