hdu 1043

bfs

先预处理。。。。在直接判断

string 很好用啊用来记录路径,刘汝佳的白书上用了 编码和 hash来记录vis【】,用了编码

开始用g++提交,一支超内存,后来没办法,试试C++,过了,又没人告诉这是毛回事啊

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int f[]={1,1,2,6,24,120,720,5040,40320,362880};
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int vis[362880];
string res[362880];
char dir[4]={'d', 'u', 'r', 'l'};

struct node
{
    int pos;
    int st[10];
    string s;
}s;
int getHash(int a[])
{
    int ans=0 ;
    for(int i=0 ;i<8 ;i++)
    {
        int cnt=0 ;
        for(int j=i+1 ;j<9 ;j++)
            if(a[j]<a[i])
                cnt++ ;
        ans+=cnt*f[8-i] ;
    }
    return ans ;

}

void init()
{
    memset(vis,0,sizeof(vis));
    s.pos=8;
    for(int i=0;i<8;i++)s.st[i]=i+1;
    s.st[8]=0;
    vis[getHash(s.st)]=1;
}
bool check(int x,int y)
{
    if(x<0||y<0||x>2||y>2)return false;
    else return true;
}
void bfs()
{
    queue<node> q;
    q.push(s);
    while(!q.empty())
    {
        node u=q.front();
        q.pop();

        for(int i=0;i<4;i++)
        {
            node v;
            int newx=u.pos/3+dx[i];
            int newy=u.pos%3+dy[i];
            if (check(newx,newy))
            {
                int newp=newx*3+newy;
                v=u;
                v.st[u.pos]=u.st[newp];
                v.st[newp]=0;
                v.pos=newp;
                if(!vis[getHash(v.st)])
                {
                    v.s+=dir[i];
                    int str=getHash(v.st);
                    vis[str]=1;
                    res[str]=v.s;
                    q.push(v);
                }
            }

        }
    }
}


int main()
{
    //freopen("t.txt","r",stdin);
    init();
    bfs();
    char c[50];
    int t[10];
    while(gets(c))
    {
        int len=strlen(c);
        int j=0;
        for(int i=0;i<len;i++)
        {

            if('1'<=c[i]&&c[i]<='9')
            {
                t[j++]=c[i]-'0';
            }
            else if(c[i]=='x')
            {
                t[j++]=0;
            }

        }
        int str=getHash(t);
        if(!vis[str])
        {
            printf("unsolvable");
        }
        else for(int i=res[str].length()-1;i>=0;i--)
        {
            cout << res[str][i] ;
        }
        cout<<endl;

    }
    return 0;
}



你可能感兴趣的:(hdu 1043)