Cantor Expand Reverse bfs +

Cantor Expand Reverse bfs +

hdu 1043

Topic links: 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\n");
            continue;
        }
        while(s!=0)
        {
            printf("%c",step_set[s].dir);
            s = step_set[s].parent;
        }
        puts("");
    }
    return 0;
}

Guess you like

Origin www.cnblogs.com/hh13579/p/12364921.html