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

    2 6 4 1 3 7 0 5 8
    8 1 5 7 3 6 4 0 2
    31
    treap sbt splay
    //今天写的八数码 速度不行呀、老超时、照着白皮书写的
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <queue>
    #define MAXSIZE 362888
    using namespace std;
    typedef int State[9];
    State st[MAXSIZE],goal;
    int dis[MAXSIZE];
    bool hash[MAXSIZE];
    int dir[4][2]={0,1,0,-1,1,0,-1,0};
    int fac[9],f[MAXSIZE];
    bool can_in(State &yy)
    {
        int c=0,k;
        for(int i=0;i<9;i++)
          {    k=0;
              for(int j=i+1;j<9;j++)
                 if(yy[j]<yy[i])
                   k++;
              c+=k*fac[8-i];
          }
        if(hash[c])
         return 0;
        hash[c]=1;
        return 1;
    }
    int BFS()
    {
        int i;
        int z,newz,x,y,newx,newy;
        int first=1,back=2;
        State t;
        while(first<back)
        {
            State &s=st[first];
            if(memcmp(&s,&goal,sizeof(s))==0) return first;
            for(z=0;z<9;z++) if(s[z]==0) break;
            x=z/3; y=z%3;
            for(i=0;i<4;i++)
            {
                newx=x+dir[i][0];
                newy=y+dir[i][1];
                if(newx>=0&&newx<3&&newy>=0&&newy<3)
                {
                    newz=newx*3+newy;
                    State &t=st[back];
                    memcpy(&t,&s,sizeof(t));
                    t[newz]=s[z];
                    t[z]=s[newz];
                    if(can_in(t))
                    {
                         dis[back]=dis[first]+1;
                         f[back]=first;
                         back++;
                    }
                }
            }
            first++;
        }
        return 0;
    }
    char rc[MAXSIZE];
    int main()
    {
        int i;fac[0]=1;
        for(i=1;i<9;i++)
         fac[i]=fac[i-1]*i;
        for(i=0;i<9;i++) goal[i]=(i+1)%9;
         f[1]=1;
        int hs[133];hs['x']=hs['X']=0;
        for(i='1';i<='8';i++)
         hs[i]=i-'0';
         char c;
        while(scanf("%c",&c)!=EOF)
        {
            st[1][0]=hs[c];i=1;
            while(scanf("%c",&c),c!='\n')
            {
               if(c!=' ') st[1][i++]=hs[c];
            }
            memset(hash,0,sizeof(hash));
            int fa,s=BFS();
               i=0;
            int zs,zf;
            while(f[s]!=s)
            {
                fa=f[s];
                for(zs=0;zs<9;zs++) if(st[s][zs]==0) break;
                for(zf=0;zf<9;zf++) if(st[fa][zf]==0) break;
                if(zf<zs)
                {
                   if(zs-zf==1)
                    rc[i++]='r';
                   else
                    rc[i++]='d';
                }
                else
                {
                    if(zf-zs==1)
                    rc[i++]='l';
                   else
                    rc[i++]='u';
                }
                s=fa;
            }
           for(s=i-1;s>=0;s--)
            printf("%c",rc[s]);
           printf("\n");
        }
        return 0;
    }

  • 相关阅读:
    2018-2019-2 网络对抗技术 20165206 Exp3 免杀原理与实践
    2018-2019-2 网络对抗技术 20165206 Exp2 后门原理与实践
    2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解
    css常见布局之三列布局--双飞翼布局和圣杯布局
    css常用布局
    基础总结(05)-- 回流和重绘
    基础总结(04)-- display:none;&&visibility:hidden;区别
    js实现点击按钮复制文本功能
    基础总结(03)-- css有趣的特性
    基础总结(02)--BFC(块级格式化上下文)
  • 原文地址:https://www.cnblogs.com/372465774y/p/2591903.html
Copyright © 2011-2022 走看看