poj3126 Prime Path(BFS水)

    xiaoxiao2023-03-25  5

    感觉似乎是水过去了?还是说这道题太水了,写完没调试测试样例正确,提交一遍过= =

    思路:先素数打表,然后在进行BFS搜索,每次改变一个数字,是素数的话就加入队列中去,直到搜到最后;

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<vector> #define INF 1<<30 #define N 10009 using namespace std; int a[N],b[N]; queue<int>q; int n,m; int bfs() { int d[4]= {1,10,100,1000}; int k,h,tn,th,i; while(!q.empty()) q.pop(); q.push(n); b[n]=0; while(!q.empty()) { h=q.front(); q.pop(); for(i=0; i<4; i++) { for(k=0; k<=9; k++) { if(i==3&&k==0)//最高位不能为0,虽说写的是BFS,不过觉得有点像爆搜; continue; tn=h/d[i]%10; th=h-tn*d[i]+k*d[i]; if(a[th]&&b[th]==INF) { q.push(th); b[th]=b[h]+1; } if(th==m) return b[m]; } } } } int main() { int t,i,j; for(i=1; i<N; i++)//素数打表; a[i]=1; a[0]=a[1]=0; int k=sqrt(N); for(i=1; i<=k; i++) if(a[i]) for(j=i*2; j<N; j+=i) a[j]=0; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); fill(b,b+N,INF); int bb=bfs(); printf("%d\n",bb); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1203840.html
    最新回复(0)