zoukankan      html  css  js  c++  java
  • 八数码问题

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<set>
     4 #include<time.h>
     5 using namespace std;
     6 
     7 typedef int state[9];
     8 const int max=1000000;
     9 state st[max],goal;
    10 int dist[max];
    11 const int dx[]={-1,1,0,0};
    12 const int dy[]={0,0,-1,1};
    13 
    14 struct cmp
    15 {
    16     bool operator ()(int a,int b)const
    17     {
    18         return memcmp(&st[a],&st[b],sizeof(st[b]))<0;
    19     }
    20 };
    21 
    22 set<int, cmp> vis;
    23 
    24 void in()
    25 {
    26     vis.clear();
    27 }
    28 
    29 int insert(int s)
    30 {
    31     if(vis.count(s)) return 0;
    32     vis.insert(s);
    33     return 1;
    34 }
    35 
    36 int bfs()
    37 {
    38     int front,rear,z,d,newy,newz,newx,x,y;
    39     rear=2;
    40     front=1;
    41     //state s,t;
    42     in();
    43     while(front<rear)
    44     {
    45         state &s=st[front];
    46         if(memcmp(goal,s,sizeof(s))==0) return front;
    47         for(z=0;z<9;z++) if(!s[z]) break;
    48         x=z/3;y=z%3;
    49         for(d=0;d<4;d++)
    50         {
    51              newx=x+dx[d];
    52              newy=y+dy[d];
    53              newz=newx*3+newy;
    54              if(newx>=0&&newx<3&&newy>=0&&newy<3)
    55              {
    56                 state &t=st[rear];
    57                  memcpy(&t,&s,sizeof(s));
    58                  t[newz]=s[z];
    59                  t[z]=s[newz];
    60                  dist[rear]=dist[front]+1;
    61                  if(insert(rear)) rear++;
    62              }
    63         }
    64         front++;
    65     }
    66     return 0;
    67 }
    68         
    69 int main()
    70 {
    71     int i,ans;
    72     for(i=0;i<9;i++) scanf("%d",&st[1][i]);
    73     for(i=0;i<9;i++) scanf("%d",&goal[i]);
    74     ans=bfs();
    75     if(ans>0) printf("%d\n",dist[ans]);
    76     else printf("-1\n");
    77     printf("%d\n",clock()/CLOCKS_PER_SEC);
    78     return 0;
    79 }
  • 相关阅读:
    灌水专栏
    工程控制基础相关指标识图与记忆
    材料力学典型习题
    材料力学大学慕课汇总
    机械工程控制基础线性系统时域分析
    ccaa
    在电脑上使用听写,以说话代替打字
    李さんは森さんより若いです
    机械制造工艺基础
    大学慕课材料力学总结
  • 原文地址:https://www.cnblogs.com/xiaofanke/p/3041130.html
Copyright © 2011-2022 走看看