您的位置:首页 > 其它

poj解题报告——3126

2014-12-21 14:58 405 查看
这题打表就挺好,大致题意:给定两个四位素数a b,要求把a变换到b,变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数与前一步得到的素数 只能有一个位不同,而且每步得到的素数都不能重复,求从a到b最少需要的变换次数。无法变换则输出Impossible

代码如下

#include<stdio.h>

#include<string.h>

int vir[10010],fa[10010],q[10010];

int dir[4]={10,100,1000,10000};

int primes[10000];

int start,end,i,j;

void prime(int *p)

{

for(i=2;i<10000;i++)

p[i]=1;

for(i=2;i<10000;i++)

{

if(p[i])

{

for(j=i+i;j<10000;j+=i)

p[j]=0;

}

}

}

int bfs(int x)

{

int front=0,rear=0,tot=0,ok=0,son;

memset(vir,0,sizeof(vir));

q[rear++]=x;

while(front<rear)

{

x=q[front++];

for(i=0;i<4;i++)

{

for(j=0;j<10;j++)

{

if(i==3&&j==0)

continue;

son=j*dir[i]/10+(x/dir[i])*dir[i]+x%(dir[i]/10);

if(!vir[son]&&primes[son])

{

q[rear++]=son;

vir[son]=1;

fa[son]=x;

if(son==end)

{

ok=1;

break;

}

}

}

if(ok)

break;

}

if(ok)

break;

}

while(son!=start)

{

son=fa[son]; tot++;

}

return tot;

}

void main()

{

int n;

prime(primes);

while(scanf("%d",&n)!=EOF)

{

while(n--)

{

scanf("%d%d",&start,&end);

printf("%d\n",bfs(start));

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: