POJ-1077/HDU-1043

Posted stddddd

tags:

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

A*算法

裸板子

技术分享图片
  1 #include<queue>
  2 #include<cmath>
  3 #include<cstdio>
  4 #include<cstdlib>
  5 #include<cstring>
  6 #include<algorithm>
  7 #define N 500005
  8 using namespace std;
  9 int jc[10],vis[N],fa[N],tp,stk[N],ans[N];
 10 int pos[9][2]={{0,0},{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1}};
 11 int dx[4]={0,0,-1,1};
 12 int dy[4]={-1,1,0,0};
 13 char tow[4];
 14 struct node
 15 {
 16     int mp[3][3];
 17     int f;
 18     int g;
 19     int h;
 20     int xx,yy;
 21     bool friend operator < (node x,node y)
 22     {
 23         return x.f!=y.f?x.f>y.f:x.g<y.g;
 24     }
 25 }sta;
 26 int check(node x)
 27 {
 28     int st[12],cnt=0;
 29     for(int i=0;i<3;i++)
 30     {
 31         for(int j=0;j<3;j++)
 32         {
 33             st[i*3+j]=x.mp[i][j];
 34             if(st[i*3+j]!=9)
 35             {
 36                 for(int k=0;k<i*3+j;k++)
 37                 {
 38                     if(st[k]!=9)
 39                     {
 40                         cnt+=(st[k]>st[i*3+j]);
 41                     }
 42                 }
 43             }
 44         }
 45     }
 46     return 1-(cnt&1);
 47 }
 48 int sol(node x)
 49 {
 50     int st[12],ret=0;
 51     for(int i=0;i<3;i++)
 52     {
 53         for(int j=0;j<3;j++)
 54         {
 55             st[i*3+j]=x.mp[i][j];
 56             int cnt=0;
 57             for(int k=0;k<i*3+j;k++)
 58             {
 59                 cnt+=(st[k]>st[i*3+j]);
 60             }
 61             ret+=jc[i*3+j]*cnt;
 62         }
 63     }
 64     return ret;
 65 }
 66 int work(node x)
 67 {
 68     int ret=0;
 69     for(int i=0;i<3;i++)
 70     {
 71         for(int j=0;j<3;j++)
 72         {
 73             if(x.mp[i][j]!=9)
 74             {
 75                 ret+=abs(pos[x.mp[i][j]][0]-i)+abs(pos[x.mp[i][j]][1]-j);
 76             }
 77         }
 78     }
 79     return ret;
 80 }
 81 void bfs()
 82 {
 83     memset(vis,0,sizeof(vis));
 84     priority_queue<node>q;
 85     sta.g=0,sta.h=work(sta);
 86     sta.f=sta.g+sta.h;
 87     q.push(sta);
 88     while(!q.empty())
 89     {
 90         node tmp=q.top();q.pop();
 91         int now=sol(tmp);
 92         for(int i=0;i<4;i++)
 93         {
 94             node nxt=tmp;
 95             nxt.xx+=dx[i];
 96             nxt.yy+=dy[i];
 97             if(nxt.xx<0||nxt.xx>2||nxt.yy<0||nxt.yy>2)
 98             {
 99                 continue;
100             }
101             nxt.mp[tmp.xx][tmp.yy]=tmp.mp[nxt.xx][nxt.yy];
102             nxt.mp[nxt.xx][nxt.yy]=9;
103             nxt.g++;
104             nxt.h=work(nxt);
105             nxt.f=nxt.g+nxt.h;
106             int jr=sol(nxt);
107             if(vis[jr])
108             {
109                 continue;
110             }
111             vis[jr]=1;
112             fa[jr]=now;
113             ans[jr]=i;
114             q.push(nxt);
115             if(!jr)
116             {
117                 return;
118             }
119         }
120     }
121 }
122 int main()
123 {
124     jc[0]=1;
125     for(int i=1;i<=9;i++)
126     {
127         jc[i]=jc[i-1]*i;
128     }
129     tow[0]=l,tow[1]=r,tow[2]=u,tow[3]=d;
130     int tx=0,ty=0;
131     for(int i=0;i<9;i++)
132     {
133         char ch[2];
134         scanf("%s",ch);
135         if(ch[0]==x)
136         {
137             ch[0]=9;
138             sta.xx=tx,sta.yy=ty;
139         }
140         sta.mp[tx][ty]=ch[0]-0;
141         ty++;
142         if(ty>=3)
143         {
144             ty-=3;
145             tx++;
146         }
147     }
148     if(!check(sta))
149     {
150         puts("unsolvable");
151         return 0;
152     }
153     int aim=sol(sta);
154     bfs();
155     int col=0;
156     while(col!=aim)
157     {
158         stk[++tp]=col;
159         col=fa[col];
160     }
161     while(tp)
162     {
163         printf("%c",tow[ans[stk[tp]]]);
164         tp--;
165     }
166     puts("");
167     return 0;
168 }
View Code

 

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

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数