UVA_11198
这个题目是个隐式图搜索的题目,可以把数值和符号分别存在两个数组里面,然后进行广搜即可。
#include<stdio.h>
#include<string.h>
int st[50000][8],sign[50000][8],dis[50000];
int head[1000003],next[50000];
int target[8]={1,2,3,4,5,6,7,8};
int isprime(int n)
{
int i;
for(i=2;i<n;i++)
if(n%i==0)
return 0;
return 1;
}
int hash(int *A)
{
int i,v=0;
for(i=0;i<8;i++)
v=10*v+A[i];
return v%1000003;
}
int insert(int s)
{
int i,h;
h=hash(st[s]);
for(i=head[h];i!=-1;i=next[i])
if(memcmp(st[i],st[s],sizeof(st[i]))==0)
break;
if(i==-1)
{
next[s]=head[h];
head[h]=s;
return 1;
}
else
return 0;
}
int main()
{
int i,j,k,p,q,front,rear,t;
t=0;
while(1)
{
scanf("%d",&st[0][0]);
if(st[0][0]==0)
break;
if(st[0][0]<0)
{
st[0][0]=-st[0][0];
sign[0][0]=0;
}
else
sign[0][0]=1;
for(i=1;i<8;i++)
{
scanf("%d",&st[0][i]);
if(st[0][i]<0)
{
st[0][i]=-st[0][i];
sign[0][i]=0;
}
else
sign[0][i]=1;
}
front=rear=0;
memset(head,-1,sizeof(head));
insert(rear);
dis[rear]=0;
rear++;
while(front<rear)
{
if(memcmp(st[front],target,sizeof(target))==0)
break;
for(i=0;i<8;i++)
{
for(j=0;j<i;j++)
if((j!=0&&(sign[front][i]^sign[front][j-1])&&isprime(st[front][i]+st[front][j-1]))
||((sign[front][i]^sign[front][j])&&isprime(st[front][i]+st[front][j])))
{
memcpy(st[rear],st[front],sizeof(st[rear]));
memcpy(sign[rear],sign[front],sizeof(sign[rear]));
p=st[rear][i];
q=sign[rear][i];
for(k=i;k>j;k--)
{
st[rear][k]=st[rear][k-1];
sign[rear][k]=sign[rear][k-1];
}
st[rear][j]=p;
sign[rear][j]=q;
if(insert(rear))
{
dis[rear]=dis[front]+1;
rear++;
}
}
for(j=i+1;j<8;j++)
if((j!=7&&(sign[front][i]^sign[front][j+1])&&isprime(st[front][i]+st[front][j+1]))
||((sign[front][i]^sign[front][j])&&isprime(st[front][i]+st[front][j])))
{
memcpy(st[rear],st[front],sizeof(st[rear]));
memcpy(sign[rear],sign[front],sizeof(sign[rear]));
p=st[rear][i];
q=sign[rear][i];
for(k=i;k<j;k++)
{
st[rear][k]=st[rear][k+1];
sign[rear][k]=sign[rear][k+1];
}
st[rear][j]=p;
sign[rear][j]=q;
if(insert(rear))
{
dis[rear]=dis[front]+1;
rear++;
}
}
}
front++;
}
printf("Case %d: ",++t);
if(front!=rear)
printf("%d\n",dis[front]);
else
printf("-1\n");
}
return 0;
}