zoukankan      html  css  js  c++  java
  • hdu 1043 Eight

    欸我一直以为双向bfs是搜完一半再搜另一半呢,妹想到是两个一起搜
    然后队列里放的结构体里不能直接存答案,所以做一个邻接表一样的东西,直接指向需要的字符即可
    记录状态用康托展开来hash
    以及居然是多组数据啊?!

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int N=500005,has[9]={1,1,2,6,24,120,720,5040,40320},dx[4]={-3,3,-1,1};
    int v1[N],v2[N];
    char a[30],d1[10]={"udlr"},d2[10]={"durl"};
    string b="123456780";
    struct qw
    {
        int a;
        char ch;
    	qw(int A=0,char C=0)
    	{
    		a=A,ch=C;
    	}
    }pre[N];
    struct qwe
    {
        int a;
        string c;
    	qwe(int A=0,string C="")
    	{
    		a=A,c=C;
    	}
    }e;
    void print(int x)
    {
        if(pre[x].a==-1)
    		return;
        print(pre[x].a);
        printf("%c",pre[x].ch);
    }
    int ha(string e)
    {
        int s=0,i,j,k;
        for(i=0;i<9;i++)
        {
            k=0;
            for(j=0;j<i;j++)
                if(e[j]>e[i])
    				k++;
            s+=k*has[i];
        }
        return s;
    }
    int main()
    {
        while(gets(a))
        {
            int k=0;
            e.c="";
            for(int i=0,j=0;i<strlen(a);i++)
                if(a[i]!=' ')
                {
                    if(a[i]=='x')
    					e.a=j,e.c+='0';
                    else 
    					e.c+=a[i];
                    j++;
                }
            for(int i=0;i<9;i++)
                if(e.c[i]!='0')
    				for(int j=0;j<i;j++)
    					if(e.c[j]!='0'&&e.c[j]>e.c[i])
    						k++;
            memset(v2,0,sizeof(v2));
            memset(v1,0,sizeof(v1));
            if(k&1)
    			printf("unsolvable
    ");
            else 
    		{
    			qwe f,g;
    			int a=2;
    			queue<qwe>q1,q2;
    			v1[ha(e.c)]=1;
    			pre[1].a=-1,pre[2].a=-1;
    			f=qwe(8,b);
    			v2[ha(f.c)]=2;
    			q1.push(e),q2.push(f);
    			while(!q1.empty()&&!q2.empty())
    			{
    				f=q1.front();
    				q1.pop();
    				int p=ha(f.c);
    				if(v2[p])
    				{
    					print(v1[p]);
    					for(int k=v2[p];pre[k].a!=-1;k=pre[k].a)
    						printf("%c",pre[k].ch);
    					printf("
    ");
    					break;
    				}
    				for(int i=0;i<4;i++)
    					if((i!=0||f.a>=3)&&(i!=1||f.a<=5)&&(i!=2||f.a%3!=0)&&(i!=3||f.a%3!=2))
    					{
    						int x=f.a+dx[i];
    						g=f;
    						swap(g.c[f.a],g.c[x]);
    						int q=ha(g.c);
    						if(v1[q])
    							continue;
    						v1[q]=++a;
    						g.a=x;
    						pre[a]=qw(v1[p],d1[i]);
    						q1.push(g);
    					}
    				f=q2.front();
    				q2.pop();
    				p=ha(f.c);
    				if(v1[p])
    				{
    					print(v1[p]);
    					for(int k=v2[p];pre[k].a!=-1;k=pre[k].a)
    						printf("%c",pre[k].ch);
    					printf("
    ");
    					break;
    				}
    				for(int i=0;i<4;i++)
    					if((i!=0||f.a>=3)&&(i!=1||f.a<=5)&&(i!=2||f.a%3!=0)&&(i!=3||f.a%3!=2))
    					{
    						int x=f.a+dx[i];
    						g=f;
    						swap(g.c[f.a],g.c[x]);
    						int q=ha(g.c);
    						if(v2[q])
    							continue;
    						v2[q]=++a;
    						g.a=x;
    						pre[a]=qw(v2[p],d2[i]);
    						q2.push(g);
    					}
    			}
    			printf("unsolvable
    ");
    		}
        }
        return 0;
    }
    
  • 相关阅读:
    Python基础之面向对象3(继承)
    Python基础之面向对象2(封装)
    python基础之面向对象1
    Python基础之变量作用域
    Python基础之函数参数
    Python基础之函数
    Python基础 之for循环嵌套实例
    Python基础之集合
    Python基础之元组和字典
    Python基础之列表深浅复制和列表推导式
  • 原文地址:https://www.cnblogs.com/lokiii/p/9146764.html
Copyright © 2011-2022 走看看