UVA 11198 - Dancing Digits
来源:互联网 发布:长歌是大腿的淘宝店铺 编辑:程序博客网 时间:2024/05/15 04:31
/*
刘汝佳的四个神题之一, 就是一个bfs+hash判重的最短路问题。
*/
#include<cstdio>
#include<cstring>#include<cstdlib>
int a[10],prim[110];
int head[1001000],next[1001000];
struct S
{
int step;
int s[10];
} q[1001000];
int judge(int x)
{
for(int i = 1; i <= 8; i++)
{
if(abs(q[x].s[i-1])!=i)
return 0;
}
return 1;
}
int hash(int x)
{
int temp=0;
for(int i = 0; i < 8; i++)
temp = temp*10+abs(q[x].s[i]);
return temp % 1000003;
}
int insert(int s)
{
int h = hash(s);
//printf("%d..\n",h);
for(int v = head[h]; v != -1; v=next[v])
{
if(memcmp(q[s].s,q[v].s,sizeof(q[s].s))==0)
return 0;
}
next[s] = head[h];
head[h] = s;
return 1;
}
int solve1(int x,int y,int *p)
{
int t1 = p[x];
// -zuo
if(x > y)
{
for(int i = x-1; i >= y; i--)
p[i+1]=p[i];
p[y] = t1;
}
else
{
for(int i = x; i < y-1; i++)
p[i] = p[i+1];
p[y-1] = t1;
}
}
int solve2(int x,int y,int *p)
{
int t1 = p[x];
// -you
if(x < y)
{
for(int i = x; i < y; i++)
p[i]=p[i+1];
p[y] = t1;
}
else
{
for(int i = x-1; i > y; i--)
p[i+1] = p[i];
p[y+1] = t1;
}
}
int bfs()
{
memset(q,0,sizeof(q));
memset(head,-1,sizeof(head));
int front=0,rear=1;
q[0].step=0;
for(int i = 0; i < 8; i++)
q[0].s[i] = a[i];
insert(0);
while(front<rear)
{
if(judge(front))
{
printf("%d\n",q[front].step);
return 0;
}
for(int i = 0; i < 8; i++)
for(int j = 0; j < 8; j++)
{
if(((q[front].s[i]<0&&q[front].s[j]>0)||(q[front].s[i]>0&&q[front].s[j]<0))&&!prim[abs(q[front].s[j])+abs(q[front].s[i])])
{
memcpy(q[rear].s,q[front].s,sizeof(q[front].s));
solve1(i,j,q[rear].s);
q[rear].step = q[front].step+1;
if(insert(rear))
rear++;
memcpy(q[rear].s,q[front].s,sizeof(q[front].s));
solve2(i,j,q[rear].s);
q[rear].step = q[front].step+1;
if(insert(rear))
rear++;
}
}
front++;
}
printf("-1\n");
}
int main()
{
for(int i = 2; i < 9; i++)
for(int j = i; j < 9; j++)
prim[i*j] = 1;
int n = 8,count=0;
while(scanf("%d",&a[0]),a[0])
{
for(int i = 1; i < 8; i++)
scanf("%d",&a[i]);
printf("Case %d: ",++count);
bfs();
}
return 0;
}
- uva 11198 - Dancing Digits
- UVA 11198 Dancing Digits
- UVA 11198 - Dancing Digits
- uva 11198 Dancing Digits
- uva 11198 - Dancing Digits 隐式图 bfs
- UVA 11198 Dancing Digits (BFS + 判重)
- uva 11198 Dancing Digits(隐式图搜索+哈细判重)
- uva 11198 - Dancing Digits 跳舞的数字 (BFS+HASH)
- UVA - 11198 Dancing Digits(bfs+hash+线性表)
- 11198 - Dancing Digits
- UVa 11198 - Dancing Digits,Rujia Liu的神题(二)
- UVa 11198 - Dancing Digits,Rujia Liu的神题(二)
- 11198 - Dancing Digits(BFS + hash判重)
- UVa 11332 - Summing Digits
- UVa 12527 - Different Digits
- UVa 11687 - Digits
- UVa 993 - Product of digits
- UVa 993 - Product of digits
- RAC数据库建立STANDBY
- Oracle 11g Release 2 (11.2) ASM实例是如何找到SPFIL
- [Linux] 六,软件包管理
- Python模块学习 ---- urllib
- [Linux] 七,进程管理
- UVA 11198 - Dancing Digits
- UVa10986 Sending email(spfa)
- BZOJ 1034([ZJOI2008]泡泡堂BNB-田忌赛马)
- zoj 1205 Martian Addition
- 美化照片
- 给黑白照片上色!
- 让你的照片更有feel!
- 燕郊小区名称
- 修复背光照片!