设为首页 加入收藏

TOP

BFS(五):八数码难题 (POJ 1077)(五)
2019-07-10 12:10:29 】 浏览:229
Tags:BFS 八数码 难题 POJ 1077
e N 9   

# define MAXN 362880

struct foot  { int k; char d;};

struct state { char a[N]; };

const char md[4] = {'u', 'l', 'r', 'd'};

const int fact[9] = {1, 1, 2, 6, 24, 120, 720, 720*7, 720*56};

state Q[MAXN+1];

char vis[MAXN];

foot p[MAXN];

int hash(state s)

// 把状态s中的0..8的排列映射为数字 0..(9!-1)

{   

       int i, j, temp, num;   

       num = 0;   

       for (i = 0; i < 9-1; i++)

       {     

            temp = 0; 

            for (j = i + 1; j < 9; j++)

           {

               if (s.a[j] < s.a[i])

               temp++;       

           }

           num += fact[8-i] * temp;

       }

       return num;

}

void print_path(int x, char f)

{

    if (p[x].k == 0) return ;

    if (f)  cout<< md[3-p[x].d];

    print_path(p[x].k, f);

    if (!f) cout<< md[p[x].d];

}

void bfs(state start, state goal)

{

    char t;

    state cur, nst;

    int front, rear, i;

    int space, ct, nt;

    Q[front = 1] = start;

    Q[rear = 2] = goal;

    vis[hash(start)] = 1;  // 1 代表正向

    vis[hash(goal)] = 2;   // 2 代表反向

    while (front <= rear)

    {

        cur = Q[front++];

        ct = hash(cur);

        for (i = 0; cur.a[i] && i < N; ++i) ;

        space=i;

        for (i = 0; i < 4; ++i)

        {

            if(!(i==0 && space<3 || i==1 && space%3==0 || i==2 && space%3==2 ||i==3 && space>5))

            {

                 nst = cur;

                 nst.a[space] = cur.a[space-5+2*(i+1)];

                nst.a[space-5+2*(i+1)] = 0;

                nt = hash(nst);

                if (!vis[nt])

                {

                    Q[++rear] = nst;

         &

首页 上一页 2 3 4 5 6 下一页 尾页 5/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇洛古最简单50题解(41-50) 下一篇BFS(四):搜索状态判重

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目