描述:坑人的一道题,不过也不难,就是数字交换,只有一正一负的数字才存在交换,并且交换之后不能形成素数
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define N 1000003
int t[10]= {1,2,3,4,5,6,7,8},cmp[]= {4,6,8,9,10,12,14,15};
int head[N],next[N],count[N];
int str[N][10][2];
int m=1,sum,flag;
int hash(int (*p)[2])
{
int x=0;
for(int i=0; i<8; i++)
x=(x*10+p[i][0])%N;
return x;
}
bool insert(int x,int rear)
{
int c=head[x];
while(c!=-1)
{
int z=0;
for(int i=0; i<8; i++)
if(str[rear][i][0]!=str[c][i][0])
{
z=1;
break;
}
if(z) c=next[c];
else return false;
}
next[rear]=head[x];
head[x]=rear;
return true;
}
void bfs()
{
memset(head,-1,sizeof(head));
memset(next,-1,sizeof(next));
memset(count,0,sizeof(count));
flag=0;
int rear=1,front=0;
while(front<rear&&rear<N)
{
for(int i=0; i<8; i++)
for(int j=0; j<8; j++)
if(str[front][j][1]+str[front][i][1]==1)
{
int c=0;
for(int k=0; k<8; k++) if(str[front][i][0]+str[front][j][0]==cmp[k])
{
c=-1;
break;
}
if(c!=-1)//前插
{
if(j>i)
{
for(int k=0; k<i; k++)
{
str[rear][k][0]=str[front][k][0];
str[rear][k][1]=str[front][k][1];
}
for(int k=j; k<8; k++)
{
str[rear][k][0]=str[front][k][0];
str[rear][k][1]=str[front][k][1];
}
for(int k=i; k<j-1; k++)
{
str[rear][k][0]=str[front][k+1][0];
str[rear][k][1]=str[front][k+1][1];
}
str[rear][j-1][0]=str[front][i][0];
str[rear][j-1][1]=str[front][i][1];
}
else
{
for(int k=0; k<j; k++)
{
str[rear][k][0]=str[front][k][0];
str[rear][k][1]=str[front][k][1];
}
for(int k=i+1; k<8; k++)
{
str[rear][k][0]=str[front][k][0];
str[rear][k][1]=str[front][k][1];
}
for(int k=i; k>j; k--)
{
str[rear][k][0]=str[front][k-1][0];
str[rear][k][1]=str[front][k-1][1];
}
str[rear][j][0]=str[front][i][0];
str[rear][j][1]=str[front][i][1];
}
for(int k=0; k<8; k++) if(str[rear][k][0]!=t[k])
{
flag=1;
break;
}
if(!flag)
{
sum=count[front]+1;
return;
}
else
{
flag=0;
int x=hash(str[rear]);
if(insert(x,rear))
{
count[rear]=count[front]+1;
rear++;
}
}
}
if(c!=-1)//后插
{
if(j>i)
{
for(int k=0; k<i; k++)
{
str[rear][k][0]=str[front][k][0];
str[rear][k][1]=str[front][k][1];
}
for(int k=j+1; k<8; k++)
{
str[rear][k][0]=str[front][k][0];
str[rear][k][1]=str[front][k][1];
}
for(int k=i; k<j; k++)
{
str[rear][k][0]=str[front][k+1][0];
str[rear][k][1]=str[front][k+1][1];
}
str[rear][j][0]=str[front][i][0];
str[rear][j][1]=str[front][i][1];
}
else
{
for(int k=0; k<=j; k++)
{
str[rear][k][0]=str[front][k][0];
str[rear][k][1]=str[front][k][1];
}
for(int k=i+1; k<8; k++)
{
str[rear][k][0]=str[front][k][0];
str[rear][k][1]=str[front][k][1];
}
for(int k=i; k>j+1; k--)
{
str[rear][k][0]=str[front][k-1][0];
str[rear][k][1]=str[front][k-1][1];
}
str[rear][j+1][0]=str[front][i][0];
str[rear][j+1][1]=str[front][i][1];
}
for(int k=0; k<8; k++) if(str[rear][k][0]!=t[k])
{
flag=1;
break;
}
if(!flag)
{
sum=count[front]+1;
return;
}
else
{
flag=0;
int x=hash(str[rear]);
if(insert(x,rear))
{
count[rear]=count[front]+1;
rear++;
}
}
}
}
front++;
}
}
int main()
{
// freopen("a.txt","r",stdin);
while(scanf("%d",&str[0][0][0])!=EOF)
{
if(!str[0][0][0]) break;
flag=0;
sum=-1;
if(str[0][0][0]>0) str[0][0][1]=1;
else
{
str[0][0][1]=0;
str[0][0][0]=-str[0][0][0];
}
for(int i=1; i<8; i++)
{
scanf("%d",&str[0][i][0]);
if(str[0][i][0]>0) str[0][i][1]=1;
else
{
str[0][i][1]=0;
str[0][i][0]=-str[0][i][0];
}
}
for(int i=0; i<8; i++)
if(str[0][i][0]!=t[i])
{
flag=1;
break;
}
if(flag)
{
bfs();
printf("Case %d: %d\n",m++,sum);
}
else printf("Case %d: 0\n",m++);
}
return 0;
}
11198 - Dancing Digits
最新推荐文章于 2016-10-21 16:52:00 发布