深度优先、广度优先和A*算法实现的重排九宫问题

  • 问题描述

在3×3的方格上分别放置1,2,3,4,5,6,7,8,9的八张排,初始状态为S0,目标状态为Sg,计算出从S0到Sg的方法。


  • 代码及说明
    /******************************************************************************
     * 使用深度优先、广度优先和A*算法解决九宫问题
    *****************************************************************************
    */


    #include
    < stdio.h >
    #include
    < iostream.h >
    #include
    < string .h >
    #include
    < stdlib.h >



    #include
    " data.h "
    #include
    " queue.h "
    #include
    " stack.h "
    #include
    " link.h "


    #define  DEEPSEARCH    1    
    #define  WIDESEARCH    2    
    #define  ASTART    3        

    #define  SEARCHTYPE WIDESEARCH    // 定义使用广度优先


    // #define SHOWPROCESS     // 定义是否显示中间过程



    class  SearchTree {    
    private:
    /***********************定义open表的数据类型************************/
    #if SEARCHTYPE==WIDESEARCH
        Queue open;
    #elif SEARCHTYPE==DEEPSEARCH
        Stack open;
    #else    
        Link open;
    #endif


        Stack close;
    public:
        
    void init();    //初始化数据
        void extend();       //扩展close表尾节点并添加进open表
         void  moveToClose();     // 将open表的头节点移动到close表中
         bool  success();         // 判断搜索是否成功
         bool  openEmpty();     // 判断open表是否为空
         void  showAnswer();     // 显示最终结果
    } ;

    void  SearchTree::showAnswer() {
        close.show();
    }


    bool  SearchTree::openEmpty() {
        
    return open.empty();
    }



    void  SearchTree::extend() {
        DATATYPE temp[LINE][ROW],buf[LINE][ROW];
        Data 
    *pid;
        
    int n,m;
        pid
    =close.getTop(*buf);    //将close表的最后一项记录复制到buf中
        for(n=0;n<LINE;n++)
            
    for(m=0;m<ROW;m++)
                
    if(buf[n][m]==0)//寻找buf中0所在的位置,0表示空格
                    goto L1;
    L1:


        memcpy(temp,buf,DATASIZE
    *sizeof(DATATYPE));    
        
    if(n!=0){    //空格上移
            temp[n][m]=temp[n-1][m];
            temp[n
    -1][m]=0;
            
    if(close.exist(*temp)==false) open.push(*temp,&pid);
    #ifdef SHOWPROCESS    
    //宏定义,决定时候输出中间过程
            cout<<"move below data to open table:"<<endl;
            showElement(
    *temp);
            getchar();
    #endif
        }




        memcpy(temp,buf,DATASIZE
    *sizeof(DATATYPE));
        
    if(n!=2){    //空格下移
            temp[n][m]=temp[n+1][m];
            temp[n
    +1][m]=0;
            
    if(close.exist(*temp)==false) open.push(*temp,&pid);
    #ifdef SHOWPROCESS
            cout
    <<"move below data to open table:"<<endl;
            showElement(
    *temp);
            getchar();
    #endif
        }

        
        memcpy(temp,buf,DATASIZE
    *sizeof(DATATYPE));
        
    if(m!=0){    //空格左移
            temp[n][m]=temp[n][m-1];
            temp[n][m
    -1]=0;
            
    if(close.exist(*temp)==false) open.push(*temp,&pid);
    #ifdef SHOWPROCESS
            cout
    <<"move below data to open table:"<<endl;
            showElement(
    *temp);
            getchar();
    #endif
        }


        
        memcpy(temp,buf,DATASIZE
    *sizeof(DATATYPE));
        
    if(m!=2){    //空格右移
            temp[n][m]=temp[n][m+1];
            temp[n][m
    +1]=0;
            
    if(close.exist(*temp)==false) open.push(*temp,&pid);
    #ifdef SHOWPROCESS
            cout
    <<"move below data to open table:"<<endl;
            showElement(
    *temp);
            getchar();
    #endif
        }


  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值