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;
}

  

原文地址:https://www.cnblogs.com/sola1994/p/4180760.html