设为首页 加入收藏

TOP

BFS(五):八数码难题 (POJ 1077)(四)
2019-07-10 12:10:29 】 浏览:227
Tags:BFS 八数码 难题 POJ 1077
 

   int n, u;  

   char path[1000]; 

   n = 1;   

   path[0] = move[0];

   u = parent[0];  

   while(parent[u] != -1)

   {      

      path[n] = move[u]; 

      ++n;    

      u = parent[u];

   }  

   for(int i=n-1; i>=0; --i)

   {       

       cout<<md[path[i]];

   }

   cout<<endl;

}

int main()

{  

   node start; 

   char ch;

   int i;

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

   {    

      cin>>ch;    

      if(ch == 'x')

         {   

         start.board[i] = 9;   

         start.space = i;   

         }    

      else      

         start.board[i] = ch - '0';  

   }   

    for (i = 0; start.board[i] == i+1 && i < 9; ++i) ;

    if (i == 9) cout<<endl;

    else

     {

              BFS(start);   

              if(visited[0] == 1)  

                   print_path(); 

               else     

                   cout<<"unsolvable"<<endl;

    }

    return 0;

}

      将上面的源程序提交给POJ系统,系统显示的评测结果是:Accept,Memory为3844K、Time为 782MS。

      (3)编程思路2。

      状态空间的表示、结点的扩展规则与编程思路1中的方法基本相同。但结点稍作修改,定义为: struct state { char a[N]; }; 不再定义空格的位置,并且程序中空格用“0”表示。对于某一当前状态cur,执行一个循环 for (i = 0; cur.a[i] && i < N; ++i) ;后,就可以确定空格位置 space=i。

      定义全局数组 state Q[MAXN+1]来作为一个队列使用,全局数组char vis[MAXN]来表示状态结点是否被访问,其中vis[i]=0,表示状态i未被访问过;vis[i]=1,表示状态i是正向扩展(从初始状态开始)来访问过的;vis[i]=2,表示状态i是反向扩展(从目标状态开始)来访问过的。全局数组foot p[MAXN]用来存储访问过的每种状态的访问足迹, 其中,p[nt].k = ct表示状态nt是由状态结点ct扩展来的,p[nt].d = i(i为0~3之一)表示状态nt是由状态结点ct按方式i扩展来的。

      用front和rear变量指示队列的队头和队尾。初始化时,初始状态start和目标状态goal均入队。

            Q[front = 1] = start;

            Q[rear = 2] = goal;

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

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

      (4)源程序2。

#include <iostream>

using namespace std;

# defin

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目