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;
    }
    
    
    
  • 相关阅读:
    免费馅饼(HDU 1176 DP)
    搬寝室(HDU 1421 DP)
    FatMouse's Speed(HDU LIS)
    Bone Collector II(HDU 2639 DP)
    Palindrome(POJ 1159 DP)
    Proud Merchants(POJ 3466 01背包+排序)
    树的最大独立集
    Roads in the North(POJ 2631 DFS)
    Starship Troopers(HDU 1011 树形DP)
    Strategic game(POJ 1463 树形DP)
  • 原文地址:https://www.cnblogs.com/hh13579/p/12364921.html
Copyright © 2011-2022 走看看