标签:搜索
Description
1033The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.
1733
3733
3739
3779
8779
8179
Input
Output
Sample Input
3 1033 8179 1373 8017 1033 1033
Sample Output
6 7 0
题意是给你两个四位数的素数n,m,没有前导0,让你每次变化一位数,使得n变成m,问最小的次数。这题是典型的bfs.因为是4位数,所以判断素数的时候只要判断能不能被2~100整除就行了。
#include<stdio.h>
#include<string.h>
int num,n,m;
int a[10];
int q[1111111][2],vis[50000]; //q[][0]数字,q[][1]次数
int prime(int n)
{
int i,flag=1;
for(i=2;i<=100;i++){
if(n%i==0){
flag=0;break;
}
}
if(flag)return 1;
else return 0;
}
int bfs()
{
int front=1,rear=1,x,t,i,xx,y;
memset(vis,0,sizeof(vis));
vis[n]=1;
q[front][0]=n;q[front][1]=0;
while(front<=rear)
{
x=q[front][0];
if(x==m) return q[front][1];
front++;
vis[x]=1;
t=0;
xx=x;
while(xx){
a[++t]=xx%10;
xx=xx/10;
}
for(i=1;i<=9;i++){
y=i*1000+a[3]*100+a[2]*10+a[1];
if( vis[y]==0 && prime(y)){
vis[y]=1;
rear++;q[rear][0]=y;q[rear][1]=q[front-1][1]+1;
}
}
for(i=0;i<=9;i++){
y=i*100+a[4]*1000+a[2]*10+a[1];
if( vis[y]==0 && prime(y)){
vis[y]=1;
rear++;q[rear][0]=y;q[rear][1]=q[front-1][1]+1;
}
}
for(i=0;i<=9;i++){
y=a[4]*1000+a[3]*100+i*10+a[1];
if( vis[y]==0 && prime(y)){
vis[y]=1;
rear++;q[rear][0]=y;q[rear][1]=q[front-1][1]+1;
}
}
for(i=0;i<=9;i++){
y=a[4]*1000+a[3]*100+a[2]*10+i;
if( vis[y]==0 && prime(y)){
vis[y]=1;
rear++;q[rear][0]=y;q[rear][1]=q[front-1][1]+1;
}
}
}
}
int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
printf("%d\n",bfs());
}
return 0;
}
标签:搜索
原文地址:http://blog.csdn.net/kirito_acmer/article/details/45482119