<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    coolfiry

    認認真真做人,兢兢業業做事!
    posts - 39, comments - 17, trackbacks - 0, articles - 0

    N皇后問題

    Posted on 2006-09-27 22:20 Coolfiry 閱讀(468) 評論(0)  編輯  收藏 所屬分類: C/C++
    N皇后問題是一個典型的需要用回溯算法來解決的問題。回溯算法可以用遞歸方法來實現,也可以用非遞歸方法來實現。用遞歸的方法來解決回溯的問題思路很清晰,但是耗費的內存資源較多,速度也較慢;非遞歸方法具有速度快和耗費較少內存資源的優點,但是程序的邏輯結構卻很復雜——不過搞懂之后覺得也很簡單。

    ???在寫非遞歸算法之前,參考了網上的一些文章,但是覺得那些程序都很晦澀難懂,而且存在一些問題,我索性自己寫了一個,花了我不少時間。

    ???遞歸實現:
    #include?"stdio.h"
    #include?
    "stdlib.h"
    #include?
    "time.h"

    /*?記錄當前的放置方案?*/
    int?*x;?
    /*?皇后的個數N?和?方案數目?*/
    int?n,sum=0;
    /*?檢查參數所指示的這一行皇后放置方案是否滿足要求?*/
    int??Place(int);
    /*?遞歸方法求取皇后放置方案*/
    void?Queen1(void);
    /*?用戶遞歸求取皇后放置方案的遞歸方法?*/
    void?TraceBack(int);
    /*?打印當前成功的放置方案?*/
    void?PrintMethod(void);

    void?main(void)
    {
    ????
    long?start,stop;
    ????printf(
    "input?n:?");
    ????scanf(
    "%d",&n);
    ????x
    =(int?*)malloc(sizeof(int)*n);
    ????time(
    &start);/*記錄開始時間*/
    ????Queen1();
    ????time(
    &stop);/*記錄結束時間*/
    ????printf(
    "\nmethod?total?%d?\n",sum);
    ????printf(
    "\nuse?%d?seconds?\n",(int)(stop-start));
    }


    int?Place(int?r)
    {
    ????
    int?i;
    ????
    for(i=0;i<r;i++){
    ????????
    if(x[r]==x[i]?||?abs(r-i)==abs(x[r]-x[i]))
    ????????????
    return?0;
    ????}

    ????
    return?1;
    }


    void?TraceBack(int?r)
    {
    ????
    int?i;
    ????
    if(r>=n){
    ????????sum
    ++;
    ????????
    /*?PrintMethod();?*/
    ????}
    else{
    ????????
    for(i=0;i<n;i++){
    ????????????x[r]
    =i;
    ????????????
    if(Place(r))?TraceBack(r+1);
    ????????}

    ????}

    }


    void?PrintMethod(void)
    {
    ????
    int?i,j;
    ????printf(
    "\nmethod?%d\n",sum);
    ????
    for(i=0;i<n;i++){
    ????????
    for(j=0;j<n;j++){
    ????????????
    if(j==x[i])?printf("*");
    ????????????
    else?printf("#");
    ????????}

    ????????printf(
    "\n");
    ????}

    }


    void?Queen1(void)
    {
    ????TraceBack(
    0);
    }

    ???非遞歸實現:

    #include?"stdio.h"
    #include?
    "stdlib.h"
    #include?
    "time.h"

    /*?記錄當前的放置方案?*/
    int?*x;?
    /*?皇后的個數N?和?方案數目?*/
    int?n,sum=0;
    /*?檢查參數所指示的這一行皇后放置方案是否滿足要求?*/
    int??Place(int);
    /*?非遞歸的方法求取皇后放置方案?*/
    void?Queen2(void);
    /*?打印當前成功的放置方案?*/
    void?PrintMethod(void);

    void?main(void)
    {
    ????
    long?start,stop;
    ????printf(
    "input?n:?");
    ????scanf(
    "%d",&n);
    ????x
    =(int?*)malloc(sizeof(int)*n);
    ????time(
    &start);/*記錄開始時間*/
    ????Queen2();
    ????time(
    &stop);/*記錄結束時間*/
    ????printf(
    "\nmethod?total?%d?\n",sum);
    ????printf(
    "\nuse?%d?seconds?\n",(int)(stop-start));
    }


    int?Place(int?r)
    {
    ????
    int?i;
    ????
    for(i=0;i<r;i++){
    ????????
    if(x[r]==x[i]?||?abs(r-i)==abs(x[r]-x[i]))
    ????????????
    return?0;
    ????}

    ????
    return?1;
    }


    void?Queen2(void)
    {
    ????
    int?i,k;
    ????
    for(i=0;i<n;i++)
    ????????x[i]
    =0;
    ????k
    =0;
    ????
    while(1){
    ????????
    if(x[k]>=n){
    ????????????
    /*?如果當前第K行的放置位置超出了范圍,那么檢查該行是否為第0行
    ???????????????如果是第0行,說明所有的方案都已經遍歷完畢,函數返回;否則回退到前一行
    ????????????
    */

    ????????????
    if(k==0)?break;
    ????????????x[k]
    =0;?/*?下次遍歷的初始位置?*/
    ????????????k
    --;?/*?返回上一行?*/
    ????????????x[k]
    ++;?/*下一種放置方案*/
    ????????}

    ????????
    else?if(!Place(k)){
    ????????????
    /*?如果當前第K行的放置方案不滿足要求,采取下一種放置方案*/
    ????????????x[k]
    ++;
    ????????}

    ????????
    else{
    ????????????
    if(k==(n-1)){
    ????????????????
    /*?如果已經是最后一行,那么表示已經成功得到一種放置方案*/
    ????????????????sum
    ++;
    ????????????????
    /*?PrintMethod();?*/
    ????????????????x[k]
    =0;?/*下次遍歷的初始位置*/
    ????????????????k
    --;?/*返回上一行*/
    ????????????????x[k]
    ++;?/*下一種放置方案*/
    ????????????}
    else
    ????????????????k
    ++;?/*?否則開始配置下一行的皇后?*/
    ????????}

    ????}

    }


    void?PrintMethod(void)
    {
    ????
    int?i,j;
    ????printf(
    "\nmethod?%d\n",sum);
    ????
    for(i=0;i<n;i++){
    ????????
    for(j=0;j<n;j++){
    ????????????
    if(j==x[i])?printf("*");
    ????????????
    else?printf("#");
    ????????}

    ????????printf(
    "\n");
    ????}

    }


    ???兩種方法的性能比較:

    N

    遞歸算法所用時間(秒)

    非遞歸算法所用時間(秒)

    13

    6

    6

    14

    37

    35

    15

    267

    254

    ?

    ?

    ?

    主站蜘蛛池模板: 中文字幕免费在线看线人动作大片| 亚洲蜜芽在线精品一区| 337p日本欧洲亚洲大胆人人| 美女网站免费福利视频| 亚洲啪啪免费视频| 美女视频黄的全免费视频网站| 亚洲制服丝袜一区二区三区| 在线观看的免费网站| 亚洲男同gay片| 国产免费午夜a无码v视频| 看亚洲a级一级毛片| 亚洲人妻av伦理| 久久成人永久免费播放| 亚洲国产精品无码久久一线 | 免费人成网上在线观看| 中文字幕第13亚洲另类| 91视频免费观看| 激情内射亚洲一区二区三区| 久久成人国产精品免费软件| 国产亚洲精品影视在线| 免费人成视网站在线观看不卡| 黄色网址免费在线观看| 亚洲黄网站wwwwww| 国产猛烈高潮尖叫视频免费| 九九九国产精品成人免费视频| 亚洲国产精品无码专区| 综合在线免费视频| 国产精品亚洲综合五月天| 亚洲AV无码之日韩精品| 久久免费看少妇高潮V片特黄| 亚洲三级在线视频| 亚洲国产成人精品女人久久久 | 伊人久久精品亚洲午夜| 蜜桃视频在线观看免费视频网站WWW | 国产日韩在线视频免费播放| 久久久亚洲欧洲日产国码二区| 日韩一区二区免费视频| 很黄很污的网站免费| 亚洲熟妇AV一区二区三区浪潮| 国产亚洲美女精品久久久| 无码日韩精品一区二区免费|