HDU 1043 Eight BFS

Posted shuguangzw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1043 Eight BFS相关的知识,希望对你有一定的参考价值。

题意:就是恢复成1,2,3,4,5,6,7,8,0;

分析:暴力BFS预处理,所有路径,用康拓展开判重,O(1)打印 93ms 还是很快的

技术分享
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int N=5005;
int fac[]= {1,1,2,6,24,120,720,5040,40320,362880};
int aim;
int cantor(char s[])
{
    int ans=0;
    for(int i=1,j=8; i<=9; ++i,--j)
    {
        int tmp=0;
        for(int k=i+1; k<=9; ++k)
            if(s[i]>s[k])++tmp;
        ans+=(tmp*fac[j]);
    }
    return ans;
}
struct Node
{
    char s[10];
    int hs;
};
struct asd
{
   bool vis;
   char c;
   int pre;
}o[362880];
queue<Node>q;
void bfs()
{
    Node a;
    for(int i=1; i<=8; ++i)
        a.s[i]=0+i;
    a.s[9]=0;
    aim=a.hs=cantor(a.s);
    o[aim].vis=1;
    q.push(a);
    while(!q.empty())
    {
        a=q.front();
        q.pop();
        int now=a.hs;
        int x;
        for(int i=1; i<=9; ++i)
            if(a.s[i]==0)x=i;
        if(x-3>0)
        {
            bool flag=0;
            swap(a.s[x],a.s[x-3]);
            a.hs=cantor(a.s);
           if(o[a.hs].vis)
                flag=1;
            if(!flag)
            {
                o[a.hs].vis=1;
                o[a.hs].c=d;
                o[a.hs].pre=now;
                q.push(a);
            }
            swap(a.s[x],a.s[x-3]);
        }
        if(x+3<10)
        {
            bool flag=0;
            swap(a.s[x],a.s[x+3]);
            a.hs=cantor(a.s);
            if(o[a.hs].vis)
                flag=1;
            if(!flag)
            {
                o[a.hs].vis=1;
                o[a.hs].c=u;
                o[a.hs].pre=now;
                q.push(a);
            }
            swap(a.s[x],a.s[x+3]);
        }
        if(x%3!=1)
        {
            bool flag=0;
            swap(a.s[x],a.s[x-1]);
            a.hs=cantor(a.s);
            if(o[a.hs].vis)
                flag=1;
            if(!flag)
            {
                o[a.hs].vis=1;
                o[a.hs].c=r;
                o[a.hs].pre=now;
                q.push(a);
            }
            swap(a.s[x],a.s[x-1]);
        }
        if(x%3)
        {
            bool flag=0;
            swap(a.s[x],a.s[x+1]);
            a.hs=cantor(a.s);
           if(o[a.hs].vis)
                flag=1;
            if(!flag)
            {
                o[a.hs].vis=1;
                o[a.hs].c=l;
                o[a.hs].pre=now;
                q.push(a);
            }
            swap(a.s[x],a.s[x+1]);
        }
    }
}
char str[30],tmp[10];
void print(int u)
{
    while(u!=aim)
    {
       printf("%c",o[u].c);
       u=o[u].pre;
    }
    printf("\n");
}
int main()
{
    for(int i=0;i<326880;++i)
      o[i].vis=0;
    bfs();
    while(gets(str))
    {
        int l=0;
        for(int i=0; str[i]!=0; ++i)
        {
            if(str[i]==x)tmp[++l]=0;
            else if(str[i]>=1&&str[i]<=9)tmp[++l]=str[i];
        }
        int ans=cantor(tmp);
        if(!o[ans].vis)
            printf("unsolvable\n");
        else
            print(ans);
    }
    return 0;
}
View Code

 

以上是关于HDU 1043 Eight BFS的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1043 Eight BFS

hdu 1043 Eight(康托展开 + BFS)

Eight HDU-1043 (bfs)

HDU 1043 Eight(双向BFS+康托展开)

反向BFS+康托展开Eight HDU - 1043

Eight HDU - 1043 (双向BFS)