zoukankan      html  css  js  c++  java
  • 搜索三·启发式搜索

    搜索三·启发式搜索

    题意:八数码问题,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
  • 相关阅读:
    nodejs--模块化
    node-package.json 文件package-lock.json
    NPM
    REPL介绍
    nvm npm nrm 区别
    docker docker-compose安装
    微信小程序对接阿里云视频点播,备忘
    python requests包爬网页数据demo
    php redis扩展地址
    php7.2.4安装rabbitmq扩展的过程中错误处理
  • 原文地址:https://www.cnblogs.com/yijiull/p/7508085.html
Copyright © 2011-2022 走看看