hdu 1043 Eight 搜索,哈希

很早之前做过,总结一下康拓展开哈希大法。当初要是懂了这玩意北京网赛那题一定能出....

http://acm.hdu.edu.cn/showproblem.php?pid=1043题目链接

http://m.blog.csdn.net/blog/lx417147512/24798653在这里看的方法

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1000008;
int md[12];
void init()
{
	int i,j;
	md[0]=1;
	for(i=1;i<=8;i++)
	{
		int ans=1;
		for(j=1;j<=i;j++)
			ans*=j;
		md[i]=ans;
	}
}
int cator(int a[],int n)
{
	int i,j,k;
	int ans=0;
	for(i=1;i<=n;i++)
	{
		k=0;
		for(j=i+1;j<=n;j++)
			if(a[i]>a[j])
				k++;
		ans+=k*md[n-i];
	}
	return ans;
}
void fuckcator(int ha,int n,int a[])
{
	int i,j,t;
	bool vis[11];
	memset(vis,false,sizeof(vis));
	for(i=1;i<=n;i++)
	{
		t=ha/md[n-i];
		for(j=1;j<=n;j++)
			if(!vis[j])
			{
				if(t==0)	break;
				--t;
			}
		a[i]=j;
		vis[j]=true;
		ha%=md[n-i];
	}
}
int pre[maxn];
char shit[maxn];
int dir[4][2]={1,0,0,1,-1,0,0,-1};
char d[5]={'u','l','d','r'};
bool judge(int x)
{
	if(x>=0&&x<3)
		return true;
	return false;
}
void bfs()
{
	queue<int>	q;
	int a[11],i;
	for(i=1;i<=8;i++)	a[i]=i;a[9]=0;
	int ha=cator(a,9);
	int nha,x,y,nx,ny,pos,npos;
	q.push(ha);pre[ha]=ha;shit[ha]='\n';
	while(!q.empty())
	{
		ha=q.front();q.pop();
		fuckcator(ha,9,a);
		for(i=1;i<=9;i++)	if(a[i]==1)	pos=i-1;
		y=pos%3;x=pos/3;
		for(i=0;i<4;i++)
		{
			nx=x+dir[i][0];
			ny=y+dir[i][1];
			if(judge(nx)&&judge(ny))
			{
				npos=nx*3+ny;
				swap(a[pos+1],a[npos+1]);
				nha=cator(a,9);
				swap(a[pos+1],a[npos+1]);
				if(pre[nha]!=-1)	continue;
				q.push(nha);
				pre[nha]=ha;
				shit[nha]=d[i];
			}
		}
	}
}
int main()
{
	int i,j,k,n,ha;
	int a[11],b[11];
	char s[100];
	init();
	memset(pre,-1,sizeof(pre));
	bfs();
	while(gets(s))
	{
		int j=1;
		for(i=0;s[i]!='\0';i++)
		{
			if(s[i]>='1'&&s[i]<='8')
				a[j++]=s[i]-'0';
			else	if(s[i]=='x')
				a[j++]=0;
		}
		ha=cator(a,9);
		if(pre[ha]==ha)	printf("lr\n");
		else if(pre[ha]==-1)	printf("unsolvable\n");
		else
		{
			for(i=ha;i!=pre[i];i=pre[i])printf("%c",shit[i]);
			printf("\n");
		}
	}
	return 0;
}

 

posted on 2015-09-29 20:48  此剑之势愈斩愈烈  阅读(176)  评论(0编辑  收藏  举报

导航