zoukankan      html  css  js  c++  java
  • 康托展开+反向bfs

    康托展开+反向bfs

    hdu 1043

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1043

    #include <iostream>
    #include <cstdio>
    #include <queue>
    using namespace std;
    struct Step_s{
        int parent;
        char dir;
    }step_set[500010];
    typedef  struct Node_s{
        int board[10];
        int x_index;
        int child;
    }Node;
    int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
    int fac[10];
    void set_fac()
    {
        fac[0] = 1;
        for(int i=1;i<=8;i++)
        {
            fac[i] = fac[i-1]*i;
        }
    }
    int board_hash(int board[])
    {
        int ans = 0;
        for(int i=0;i<9;i++)
        {
            int k = 0;
            for(int j=i+1;j<9;j++)
            {
                if(board[j]<board[i])
                    k++;
            }
            ans += k * fac[8-i];
        }
        return ans;
    }
    void bfs(int finish[])
    {
        queue<Node> Q;
        Node current;
        int tx,ty,temp;
        for(int i=0;i<9;i++)
        {
            current.board[i] = finish[i];
        }
        current.x_index = 8,current.child = 0;
        step_set[current.child].parent = 0;
        Q.push(current);
        while(Q.size())
        {
            current = Q.front();
            Q.pop();
    
            for(int i=0;i<4;i++)
            {
                Node Next = current;
                tx = current.x_index % 3 + dir[i][0];
                ty = current.x_index / 3 + dir[i][1];
                if(tx>=0&&ty>=0&&tx<3&&ty<3)
                {
                    Next.x_index = ty * 3 + tx;
                    temp = Next.board[Next.x_index];
                    Next.board[Next.x_index] = Next.board[current.x_index];
                    Next.board[current.x_index] = temp;
                    Next.child = board_hash(Next.board);
                    if(step_set[Next.child].parent == -1)
                    {
                        step_set[Next.child].parent = current.child;
                        if(i == 0)step_set[Next.child].dir = 'l';
                        if(i == 1)step_set[Next.child].dir = 'r';
                        if(i == 2)step_set[Next.child].dir = 'u';
                        if(i == 3)step_set[Next.child].dir = 'd';
                        Q.push(Next);
                    }
                }
            }
        }
    }
    int main() {
        int i,j,finish[10],board_input[10];
        string ch;
        set_fac();
        for(i=0;i<9;i++)
        {
            finish[i] = i + 1;
        }
        for(i=0;i<500000;i++)
        {
            step_set[i].parent = -1;
        }
    
        bfs(finish);
        while(getline(cin,ch))
        {
            int s;
            for(i=0,j=0;i<ch.size();i++)
            {
                if(ch[i] == 'x')
                {
                    board_input[j++] = 9;
                }
                else if(ch[i] >= '1' && ch[i] <= '8')
                {
                    board_input[j++] = ch[i] - '0';
                }
            }
    
            s = board_hash(board_input);
            if(step_set[s].parent== -1 )
            {
                printf("unsolvable
    ");
                continue;
            }
            while(s!=0)
            {
                printf("%c",step_set[s].dir);
                s = step_set[s].parent;
            }
            puts("");
        }
        return 0;
    }
    
    
    
  • 相关阅读:
    实现基于C++的动态事件机制(转)
    D3D HLSL 一段代码注释
    directx加载ms3d动画模型
    几种空间分割算法研究之bsp
    IxEngine开发笔记
    使用UVAtlas技术管理贴图
    八叉树
    c#调用C++写的dll导出类,包含继承,重载等详细介绍(转载)
    给自己毕业前的一点任务
    大小端问题
  • 原文地址:https://www.cnblogs.com/hh13579/p/12364921.html
Copyright © 2011-2022 走看看