搜索三·启发式搜索

搜索三·启发式搜索

题意:八数码问题,bfs+哈希

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define FP freopen("in.txt","r",stdin)
 4 const int maxn=400010;
 5 const int mod=1313131;
 6 
 7 typedef int Sta[9];
 8 Sta st[maxn],goal;
 9 int dis[maxn];
10 int head[mod],nex[maxn];
11 int dir[4][2]={0,1,0,-1,1,0,-1,0};
12 
13 void init_vis(){
14     memset(head,-1,sizeof(head));
15 }
16 
17 int hs(Sta& s){
18     int v=0;
19     for(int i=0;i<9;i++) v=v*10+s[i];
20     return v%mod;
21 }
22 
23 int try_vis(int s){
24     int u=hs(st[s]);
25     for(int v=head[u];v!=-1;v=nex[v]){
26         if(memcmp(st[s],st[v],sizeof(st[s]))==0) return 0;
27     }
28     nex[s]=head[u];
29     head[u]=s;
30     return 1;
31 }
32 
33 int bfs(){
34     init_vis();
35     int ff=1,ee=2;
36     dis[ff]=0;
37     while(ff<ee){
38         Sta& s=st[ff];
39         if(memcmp(s,goal,sizeof(s))==0) return ff;
40         int z;
41         for(z=0;z<9;z++) if(!s[z]) break;
42         int x=z/3,y=z%3;
43         for(int i=0;i<4;i++){
44             int nx=x+dir[i][0];
45             int ny=y+dir[i][1];
46             int nz=nx*3+ny;
47             if(nx>=0&&nx<3&&ny>=0&&ny<3){
48                 Sta& t=st[ee];
49                 memcpy(&t,&s,sizeof(s));
50                 t[nz]=s[z];
51                 t[z]=s[nz];
52                 dis[ee]=dis[ff]+1;
53                 if(try_vis(ee)) ee++;
54             }
55         }
56         ff++;
57     }
58     return 0;
59 
60 }
61 int main(){
62     //FP;
63     int T;
64     scanf("%d",&T);
65     for(int i=0;i<9;i++) goal[i]=(i+1)%9;
66     while(T--){
67         for(int i=0;i<9;i++) scanf("%d",&st[1][i]);
68         int ans=bfs();
69         if(ans>0) printf("%d
",dis[ans]);
70         else puts("No Solition!");
71     }
72 }
View Code
原文地址:https://www.cnblogs.com/yijiull/p/7508085.html