zoukankan      html  css  js  c++  java
  • 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]='
    ';
    	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]!='';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
    ");
    		else if(pre[ha]==-1)	printf("unsolvable
    ");
    		else
    		{
    			for(i=ha;i!=pre[i];i=pre[i])printf("%c",shit[i]);
    			printf("
    ");
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    Docker 文档编译
    Docker CentOS 安装方法
    Docker CentOS 安装要求
    Docsify 的文档页面标题在那里设置
    Docsify 的 GitHub 链接在那里设置的
    GitHub 中如何启用 GitHub Pages 中的子域名
    Spring API 的 CORS 测试 提示错误 Reason: header ‘authorization’ is not allowed
    Spring API 的 CORS 测试
    CentOS 7 安装 JDK 11
    Postman API 获得文件如何保存
  • 原文地址:https://www.cnblogs.com/bitch1319453/p/4847262.html
Copyright © 2011-2022 走看看