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
    */
  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    690. Employee Importance
    1723. Find Minimum Time to Finish All Jobs
    LeetCode 329 矩阵中最长增长路径
    7.2 物理内存管理
    LeetCode 面试题 特定深度节点链表
    LeetCode 100 相同的树
    npm安装包命令详解,dependencies与devDependencies实际区别
  • 原文地址:https://www.cnblogs.com/heqinghui/p/3207672.html
Copyright © 2011-2022 走看看