hdu1043 A*+康托展开

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<math.h>
  4 #include<queue>
  5 #include<stack>
  6 using namespace std;
  7 typedef struct node
  8 {
  9     int f,g,h;
 10     int x,y;
 11     char map[5][5];
 12     friend bool operator <(node a,node b)
 13     {
 14         if (a.f==b.f) return (a.g<b.g);
 15         return (a.f>b.f);
 16     }
 17 };
 18 node start,next;
 19 int jie[10],vis[1000005],pre[1000005];
 20 char ans[1000005],str[1005];
 21 int to[4][2]={1,0,0,1,-1,0,0,-1};
 22 char to_c[5]="drul";
 23 int check()//判断可否 
 24 {
 25     int ss[20];
 26     int i,j,cnt=0;
 27     for (i=0;i<3;i++)
 28      for (j=0;j<3;j++)
 29      if (start.map[i][j]!='x') 
 30      {
 31          ss[cnt]=start.map[i][j];
 32          cnt++;
 33      }
 34     cnt=0;
 35     for (i=0;i<9;i++)
 36      for (j=i+1;j<9;j++)
 37      if (ss[j]<ss[i]) cnt++;
 38     if (cnt%2==0) return 1;
 39     return 0; 
 40 }
 41 int solve(node a) //康托 
 42 {
 43     int ss[20];
 44     int i,j,cnt=0,tt,temp;
 45     for (i=0;i<3;i++)
 46      for (j=0;j<3;j++)
 47      {
 48          ss[cnt]=a.map[i][j];
 49          cnt++;
 50      }
 51     temp=0;
 52     for (i=0;i<9;i++)
 53     {
 54         tt=0;
 55         for (j=i+1;j<9;j++)
 56          if (ss[j]<ss[i]) tt++;
 57         temp=temp+jie[8-i]*tt; 
 58     }
 59     return temp;
 60 }
 61 int geth(node a)//得到H值
 62 {
 63     int i,j,temp=0,z,xx,yy;
 64     for (i=0;i<3;i++)
 65      for (j=0;j<3;j++)
 66      if (a.map[i][j]!='x')
 67      {
 68          z=a.map[i][j]-'0';
 69          xx=(z-1)/3;
 70          yy=z-1-xx*3;
 71          temp+=abs(xx-i)+abs(yy-j);
 72      }
 73     return temp;
 74 }
 75 void bfs()//A*
 76 {
 77     int k_s,k_n,i;
 78     node a;
 79     priority_queue<node>q;
 80     while (!q.empty()) q.pop();
 81     memset(vis,0,sizeof(vis));
 82     start.g=0; start.f=start.h=geth(start);
 83     vis[solve(start)]=1;
 84     q.push(start);
 85     while (!q.empty())
 86     {
 87         a=q.top();
 88         q.pop();
 89         k_s=solve(a);
 90         for (i=0;i<4;i++)
 91         {
 92             next=a;
 93             next.x+=to[i][0];
 94             next.y+=to[i][1];
 95             if (next.x<0||next.y<0||next.x>2||next.y>2) continue;
 96             next.map[a.x][a.y]=a.map[next.x][next.y];
 97             next.map[next.x][next.y]='x';
 98             next.g++; next.h=geth(next);
 99             next.f=next.g+next.h;
100             k_n=solve(next);
101             if (vis[k_n]==1) continue;
102             vis[k_n]=1;
103             q.push(next);
104             pre[k_n]=k_s;
105             ans[k_n]=to_c[i];
106             if (k_n==0) return;
107         }
108         
109     }
110     return;
111 }
112 int main()
113 {
114     int i,x,y,len,judge,now;
115     jie[0]=1;
116     for (i=1;i<=9;i++) jie[i]=jie[i-1]*i;
117     while (gets(str))
118     {
119         x=y=0; len=strlen(str);
120         for (i=0;i<len;i++)
121         if (str[i]>'0'&&str[i]<'9'||str[i]=='x')
122         {
123             start.map[x][y]=str[i];
124             if (str[i]=='x') 
125             {
126                 start.x=x;
127                 start.y=y;
128             }
129             y++;
130             if (y==3){x++; y=0; }
131         }
132         if (check()==0) {printf("unsolvable\n"); continue; }
133         judge=solve(start); now=0;
134         bfs(); 
135         stack<int>s;
136         while (judge!=now)
137         {
138             s.push(ans[now]);
139             now=pre[now];
140         }
141         while (!s.empty())
142         {
143             printf("%c",s.top());
144             s.pop();
145         }
146         printf("\n");
147     }
148     return 0;
149 }

http://acm.hdu.edu.cn/showproblem.php?pid=1043

posted on 2014-07-16 14:53  xiao_xin  阅读(250)  评论(0)    收藏  举报

导航