zoukankan      html  css  js  c++  java
  • hdu 1043 eight(poj 1077) (bfs)

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    typedef int State[9];
    const int MAXSTATE=1000000;
    State st[MAXSTATE],goal;
    //int dist[MAXSTATE];
    
    int vis[362880],fact[9];
    const int dx[]={-1,1,0,0}; //u d l r //d u r l
    const int dy[]={0,0,-1,1};
    struct father
    {
      int nfa;
      char op;
    };
    father fa[MAXSTATE];
    void init_lookup_table()  //初始化查找表
    {
      fact[0]=1;
      for(int i=1;i<9;i++) fact[i]=fact[i-1]*i;
    }
    int try_to_insert(int s)
    {
      int code=0;
      for(int i=0;i<9;i++)
      {
        int cnt=0;
        for(int j=i+1;j<9;j++) if(st[s][j]<st[s][i]) cnt++;
        code+=fact[8-i]*cnt;
      }
      if(vis[code]) return 0;
      return vis[code]=1;
    }
    int find_id(int s)
    {
      int code=0;
      for(int i=0;i<9;i++)
      {
        int cnt=0;
        for(int j=i+1;j<9;j++) if(st[s][j]<st[s][i]) cnt++;
        code+=fact[8-i]*cnt;
      }
      return code;
    }
    void bfs()
    {
      init_lookup_table();
      int front=1,rear=2,z;
      int idfront=find_id(front);
      vis[idfront]=1;
      fa[idfront].nfa=-1;
      while(front<rear)
      {
        //printf("%d %d..
    ",front,rear);
        State& s=st[front];
        idfront=find_id(front);
        for(z=0;z<9;z++) if(!s[z])break;//查找 0 的位置
        int x=z/3,y=z%3;
        for(int d=0;d<4;d++)  //d u r l
        {
          int newx=x+dx[d];
          int newy=y+dy[d];
          int newz=newx*3+newy;
          if(newx>=0&&newx<3&&newy>=0&&newy<3)
          {
            State & t=st[rear];
            memcpy(&t,&s,sizeof(s));
            t[newz]=s[z];
            t[z]=s[newz];
            /*for(int ii=0;ii<9;ii++)
            {
                printf("%d ",t[ii]);
            }
            printf("
    ");*/
            if(try_to_insert(rear))
            {
              int idrear=find_id(rear);
              fa[idrear].nfa=idfront;
              //printf("%d %d...
    ",rear,idrear);
              if(d==0) //d u r l
              {
                  fa[idrear].op='d';
              }
              else if(d==1)
              {
                fa[idrear].op='u';
              }
              else if(d==2)
              {
                fa[idrear].op='r';
              }
              else if(d==3)
              {
                fa[idrear].op='l';
              }
              rear++;
            }
          }
        }
        front++;
      }
    }
    int main()
    {
      //freopen("out.txt","w",stdout);
      int i;
      char temp;
      memset(fa,0,sizeof(fa));
      memset(vis,0,sizeof(vis));
      for(i=1;i<=8;i++) st[1][i-1]=i;
        st[1][8]=0;
      bfs();
    
      while(cin>>temp)
      {
        if(temp!='x') goal[0]=temp-'0';
        else          goal[0]=0;
        for(i=1;i<9;i++)
        {
          cin>>temp;
          if(temp!='x') goal[i]=temp-'0';
          else          goal[i]=0;
        }
        int code=0;
        for(int i=0;i<9;i++)
        {
         int cnt=0;
          for(int j=i+1;j<9;j++) if(goal[j]<goal[i]) cnt++;
         code+=fact[8-i]*cnt;
        }
        if(fa[code].nfa==0) printf("unsolvable
    ");
        else
        {
           int now=code;
           while(1)
            {
             if(now==0) {printf("
    ");break;}
               printf("%c",fa[now].op);
               now=fa[now].nfa;
            }
        }
      }
      return 0;
    }
    

      

  • 相关阅读:
    关于Dijkstra三种堆速度的研究
    [BZOJ1041][HAOI2008]圆上的整点[数论]
    [BZOJ2482][Spoj1557] Can you answer these queries II[线段树]
    [CF600E]Lomsat gelral[dsu on tree/树上启发式合并]
    [BZOJ3495]PA2010 Riddle[2-SAT]
    [9.26模拟] 伪造
    [bzoj4722] 由乃
    [bzoj2004] 公交线路
    [51nod1314] 定位系统
    [51nod1143] 路径和树
  • 原文地址:https://www.cnblogs.com/sola1994/p/4180760.html
Copyright © 2011-2022 走看看