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

    /*调用算法中函数求写一个排序*/
    #include <iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<string.h>
    #include<stdio.h>
    #include<stdlib.h>
    using namespace std;
    #define maxn 2600000
    typedef int State[9];
    State st[maxn],goal;
    int dist[maxn];
    const int dx[]= {-1,1,0,0};
    const int dy[]= {0,0,-1,1};
    int vis[36288],fact[9];
    /*void init_lookup_table()
    {
        int i;
        fact[0]=1;
        for(i=0;i<9;i++)
        fact[i]=fact[i-1]*i;
    }
    int try_to_insert(int s)
    {
        int code=0,i,j,cnt;//把st[s]映射到整数code
        for(i=0;i<9;i++)
        {
            cnt=0;
            for(j=i+1;j<9;j++)
            if(st[s][j]<st[s][i])
            cnt++;
            code+=fact[8-i]*cnt;
        }
        if(vis[code])
        return 0;
        return vis[code]=1;
    }*/
    const int MAXHASHSIZE  = 1000003;
    int head[MAXHASHSIZE],next[maxn];
    void init_lookup_table()
    {
        memset(head,0,sizeof(head));
    }
    int hash(State & s)
    {
        int v =0;
        for(int i=0; i<9; i++)
            v=v*10+s[i];
        return v % MAXHASHSIZE;
    }
    int try_to_insert(int s)
    {
        int h=hash(st[s]);
        int u=head[h];
        while(u)
        {
            if(memcmp(st[u],st[s],sizeof(st[s]))==0)
                return 0;
            u=next[u];
        }
        next[s]=head[h];
        head[h]=s;
        return 1;
    }
    int bfs()
    {
        int y,d;
        init_lookup_table();
        int front =1,rear =2;
        while(front<rear)
        {
            State & s =st[front];
            if(memcmp(goal,s,sizeof(s))==0)
                return front;
            int z;
            for(z=0; z<9; z++)
                if(!s[z])
                    break;
            int x =z/3;
            y=z%3;
            for(d = 0; d <4; d++)
            {
                int newx =x +dx[d];
                int newy =y +dy[d];
                int newz =newx*3+newy;
                if(newx>=0&&newx<3&&newy>=0&&newy<3)
                {
                    State &t =st[rear];
                    memcpy(&t,&s,sizeof(s));
                    t[newz]=s[z];
                    t[z]=s[newz];
                    dist[rear]=dist[front]+1;
                    if(try_to_insert(rear))
                        rear++;
                }
            }
            front++;
        }
        return 0;
    }
    int main()
    {
        int i;
        while(1)
        {
            for(i=0; i<9; i++)
                scanf("%d",&st[1][i]);
            for(i=0; i<9; i++)
                scanf("%d",&goal[i]);
            int ans=bfs();
            if(ans>0)
                printf("%d
    ",dist[ans]);
            else
                printf("-1
    ");
        }
        return 0;
    }
    /*
    2 6 4 1 3 7 0 5 8
    8 1 5 7 3 6 4 0 2
    31
    */
  • 相关阅读:
    配置java环境变量
    编写Java中的第一个Java程序:HelloWorld(你好世界:问世)
    对Java的加载与执行的理解(理论比较重要)
    JDK、JRE、JVM三者之间的关系?
    Java语言的特性
    计算机编程语言发展史
    DRF解析器
    DRF分页组件
    DRF频率组件
    DRF权限组件
  • 原文地址:https://www.cnblogs.com/heqinghui/p/3207672.html
Copyright © 2011-2022 走看看