POJ 3126 Prime Path

来源:互联网 发布:中颖单片机烧录器 编辑:程序博客网 时间:2024/04/30 06:10

题目大意:

给你两个四位数的素数,求将素数一变成素数二需要多少步

变换规则:

每一步都能改变一位数字,但要求改变之后的数依然是素数

这题我们可以先用hash把所有的四位数记录下来

然后用dfs搜索即可(过程中需注意定义一个h数组把已经搜索过的数记录下来,不然会错的)

#include<stdio.h>#include<math.h>#include<string.h>#include<algorithm>#include<limits.h>using namespace std;struct node{int x;int step;}list[111111];int f(int n){for(int i=2; i*i<= n; i++)if(n%i==0)return 0;return 1;}int main(){int hash[11111];int h[11111];memset(hash,0,sizeof(hash));for(int i=1000; i<= 9999; i++)if(f(i))hash[i]= 1;int T; scanf("%d",&T);while(T--){int n,m;scanf("%d %d",&n,&m);int front,rear;front= rear=0;list[rear].x= n;list[rear].step=0;memset(h,0,sizeof(h));h[rear]==1;while(rear<= front){if(list[rear].x==m){printf("%d\n",list[rear].step);break;}int k= list[rear].x/10;k*= 10;for(int i=0; i<= 9; i++){int t=k+i;if(h[t]==0&&hash[t]&&t!=list[rear].x){list[front+1].x= t;list[front+1].step= list[rear].step+1;front++;h[t]= 1;}}//printf("1\n");k= list[rear].x/100;k= k* 100+ list[rear].x%10;for(int i=0; i<= 9; i++){int t=k+ i* 10;if(h[t]==0&&hash[t]&&t!=list[rear].x){list[front+1].x= t;list[front+1].step= list[rear].step+1;front++;h[t]= 1;}}//printf("2\n");k= list[rear].x/1000;k= k* 1000 + list[rear].x%100;for(int i=0; i<= 9; i++){int t=k+ i* 100;//if(i==7)//printf("%d %d\n",t,hash[t]);if(h[t]==0&&hash[t]&&t!=list[rear].x){list[front+1].x= t;list[front+1].step= list[rear].step+1;front++;h[t]= 1;}}//printf("3\n");k= list[rear].x%1000;for(int i=1; i<= 9; i++){int t=k+ i* 1000;//printf("k:%d\n",k);if(h[t]==0&&hash[t]&&t!=list[rear].x){list[front+1].x= t;list[front+1].step= list[rear].step+1;front++;h[t]= 1;}}//printf("4\n");rear++;}//printf("%d %d\n",rear,front);}return 0;}

原创粉丝点击