POJ 3126 Prime Path出了问题
代码
#include <cstdio>
#include <cstring>
using namespace std;
int T,a,b;
const int maxn=1e4;
int prime[maxn],cnt;
int vis[maxn],tot; //0表示是素数,1表示是合数
int dis[maxn];
int q[maxn],h,t,aa,aaa,aaaa;//q是数组模拟的队列
int vv[maxn];
void get_prime(int n)//欧拉筛,在洛谷过了,没问题
{
for(int i=2;i<n;++i)
{ //这里直接跳过1
if(!vis[i])
prime[cnt++]=i; //记录素数
for(int j=0;j<cnt&&i<=n/prime[j];++j)
{
vis[i*prime[j]]=1;
if (i%prime[j]==0)//避免重复筛选
break;
}
}
}
int main()
{
get_prime(10000);
scanf("%d",&T);
while(T--)
{
memset(vv,0,sizeof(vv));
t=h=0;
tot=0;//不初始化见祖宗
scanf("%d%d",&a,&b);
if(a==b)
{
printf("0\n");
continue;//泰裤辣!
}
memset(dis,0,sizeof(dis));
vv[a]=1;
q[0]=a;
while(t<=h)
{
if(tot)break;
aa=q[t];
++t;
for(int i=1;i<10000;i*=10)
{
if(tot)break;
aaa=aa-aa%(i*10)/i*i;//枚举嘎掉哪一位(试过,这应该没毛病)
for(int j=0;j<10;++j)//枚举把哪一位换成多少
{
aaaa=aaa+j*i;
if(aaaa==aa||vis[aaaa]||vv[aaaa])continue;
q[h]=aaaa;
++h;
dis[aaaa]=dis[aa]+1;
vv[aaaa]=1;
if(aaaa==b)
{
tot=1;
break;
}
}
}
}
if(tot)printf("%d\n",dis[b]);
else printf("Impossible\n");
}
return 0;
}
我的主要思路(可能错)
以初始值a为起点,枚举每个位被改的情况进行宽搜。
还请各位给我“找找茬”,我调了一下午加一晚上了!