• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-48  評(píng)論-259  文章-1  trackbacks-0

            一、8皇后問(wèn)題的分析   

             

            8皇后問(wèn)題實(shí)際上很容易一般化為n-皇后問(wèn)題,即要求找出在一個(gè)n*n棋盤(pán)上放置n個(gè)皇后并使其不能互相攻擊的所有方案。令(x1,x )表示一個(gè)解,其中x 是把第i個(gè)皇后放在第i行的列數(shù)。由于沒(méi)有兩個(gè)皇后可以放入同一列;因此這所有的xi將是截然不同的。那么應(yīng)如何去測(cè)試兩個(gè)皇后是否在同一條斜角錢上呢? 

                如果設(shè)想:棋盤(pán)的方格像二維數(shù)組a(1:n,1:n)的下標(biāo)那樣標(biāo)記,那么可以看到,對(duì)于在同一條斜角線上的由左上方到右下方的每一個(gè)元素有相同的行一列值,同樣,在同一條斜角線上的由右上方到左下方的每一個(gè)元素則有相同的+列值。假設(shè)有兩個(gè)皇后被放置在(i,j)和(k,1)位置上,那么根據(jù)以上所述,僅當(dāng)

                    i-j=k-1或i+j=k+1

            時(shí),它們才在同一條斜角線上。將這兩個(gè)等式分別變換成

                   j-1=i-k 和 j-1=k-i

            因此,當(dāng)且僅當(dāng)|j一1|=|ik|時(shí),兩個(gè)皇后在同一條斜角線上。

                過(guò)程Place(k)返回一個(gè)布爾值,當(dāng)?shù)趉個(gè)皇后能放置于x(k)的當(dāng)前值處時(shí),這個(gè)返回值為真。這個(gè)過(guò)程測(cè)試兩種情況,即x(k)是否不同于前面x(1),x(k-1)的值以及在同一條斜角線上是否根本就沒(méi)有別的皇后。該過(guò)程的計(jì)算時(shí)間是

            二、8皇后問(wèn)題的算法  

             

            [算法]: 可以放置一個(gè)新皇后嗎?   [動(dòng)畫(huà)]

                procedure Place(k)

                //如果一個(gè)皇后能放在第k行和x(k)列,則返回.true;否則返回false。x是

                個(gè)全程數(shù)組,進(jìn)入此過(guò)程時(shí)已置了k個(gè)值。abs(r)過(guò)程返回r的絕對(duì)值//

                global x(1:k);integer i;k

                iß1

                while i<k do

                if x(i)=x(k) //在同一列有兩個(gè)皇后//

                or abs(x(i)-x(k))=abs(i-k) //在同一條斜角線上//

                then return(false)

                endif

                ißi+1

                repeat

                return(true)

                end Place

            使用過(guò)程Place來(lái)改進(jìn)以上算法給出的一般回溯方法,可得出下面求n皇后問(wèn)題正確解的算法。

               [算法]: n皇后問(wèn)題的所有解   [動(dòng)畫(huà)]

                procedure nqueens(n)

                //此過(guò)程使用回溯法求出在一個(gè)n*n棋盤(pán)上放置n個(gè)皇后,使其不能互相攻擊

                的所有可能位置//

                integer k,n,x(1:n)

                x(1)ß0;kß1 //k是當(dāng)前行;x(k)是當(dāng)前列//

                whilek>0 do //對(duì)所有的行執(zhí)行以下語(yǔ)句//

                x(k)ßx(k)+1 //移到下一列//

                while x(k)n and not Place(k) do //此處能放這個(gè)皇后嗎/

                x(k)+x(k)+1

                repeat

                ifx(k)n //找到一個(gè)位置//

                then if k=n //是一個(gè)完整的解嗎//

                thenprint(x) //是,打印這個(gè)數(shù)組//

                              elsek<--k+1;x(k)+0 //轉(zhuǎn)向下一行//

                endif

                else kßk-1 "回溯"

                endif

                repeat

                end nqueens

                此時(shí),讀者可能對(duì)于過(guò)程nqueens怎么會(huì)優(yōu)于硬性處理感奇怪。原因是這樣的,如果硬

            性要求一個(gè)8*8的棋盤(pán)安排出8塊位置,就有 種可能的方式,即要檢查將近4.4*10 個(gè)8元組。然而過(guò)程nqueens只允許把皇后放置在不同的行和列上,因此至多需要作81次檢

            查,即至多只檢查40320個(gè)8元組。

            可以用過(guò)程estimate來(lái)估算nqueens所生成的結(jié)點(diǎn)數(shù)。要指出的是,過(guò)程estimate所需要的假定也適用于nqueens,即,使用固定的限界函數(shù)且在檢索進(jìn)行時(shí)函數(shù)不改變。另外,在狀態(tài)空間樹(shù)的同一級(jí)的所有結(jié)點(diǎn)都有相同的度。圖44.8顯示了由過(guò)程estimate求結(jié)點(diǎn)估計(jì)數(shù)所用的五個(gè)8x8棋盤(pán)。如同所要求的那樣,棋盤(pán)上每一個(gè)皇后的位置是隨機(jī)選取的。對(duì)于每種選擇方案,都記下了可以將一個(gè)皇后合法地放在各行中列的數(shù)目(即狀態(tài)樹(shù)的每一級(jí)沒(méi)受限的結(jié)點(diǎn)數(shù))。它們都列在每個(gè)棋盤(pán)下方的向量中。向量后面的數(shù)字表示過(guò)程estimate由這些量值所產(chǎn)生的值。這五次試驗(yàn)的平均值是1625。8皇后狀態(tài)空間樹(shù)的結(jié)點(diǎn)總數(shù)是

             因此不受限結(jié)點(diǎn)的估計(jì)數(shù)大約只是8皇后狀態(tài)空間樹(shù)的結(jié)點(diǎn)總數(shù)的2.34%。

            [動(dòng)畫(huà)]

            posted on 2007-06-21 22:21 星夢(mèng)情緣 閱讀(6665) 評(píng)論(5)  編輯 收藏 引用 所屬分類: 算法分析

            評(píng)論:
            # re: 經(jīng)典算法(5)---8—皇后問(wèn)題 2007-06-22 23:25 | pass86
            記得以前學(xué)習(xí)的時(shí)候用了回溯的算法。  回復(fù)  更多評(píng)論
              
            # re: 經(jīng)典算法(5)---8—皇后問(wèn)題 2007-06-22 23:45 | 星夢(mèng)情緣
            我有回溯算法的,不過(guò)沒(méi)發(fā)上來(lái)  回復(fù)  更多評(píng)論
              
            # re: 經(jīng)典算法(5)---8—皇后問(wèn)題 2007-06-26 17:36 | 匿名
            可以改進(jìn)一下,用4個(gè)全局的數(shù)組分別存放8行、8列、兩種斜線各15條上是否已經(jīng)放了皇后。 每放置或取走一個(gè)皇后,都改一下這四個(gè)數(shù)組。這樣判斷是否能放,4個(gè)條件就夠了,不用循環(huán)。  回復(fù)  更多評(píng)論
              
            # re: 經(jīng)典算法(5)---8—皇后問(wèn)題 2007-12-13 15:28 | jenny
            // 八皇后2.cpp : Defines the entry point for the console application.
            //

            #include "stdafx.h"
            #include "stdio.h"
            #include "iostream.h"
            #include "math.h"
            #define NUM 8 /*定義數(shù)組的大小*/
            int x[NUM+1];
            int place(int k)
            {
            int i=1;
            while(i<k)
            {
            if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k))
            return 0;
            i++;
            }
            return 1;
            }
            void nqueens(int n)
            {
            int k;
            int t;
            int d=1;
            x[1]=0;k=1;
            int tt=n/2;
            while(k>0&&k<=n)
            {
            x[k]=x[k]+1;
            { while(x[k]<=n&&!place(k))
            x[k]=x[k]+1;
            if(x[k]<=n)
            {
            if((k==n)&&(n%2==0))
            { cout<<"輸出皇后 {"<<d<<"} 隊(duì)列"<<endl;
            d++;
            for(int i=1;i<NUM+1;i++)
            printf("%5d",x[i]);
            cout<<endl;
            }
            else {k++;x[k]=0;}
            }
            else k--;
            }
            }
            }
            int main(int argc, char* argv[])
            {
            nqueens(NUM);
            return 0;
            }
              回復(fù)  更多評(píng)論
              
            # re: 經(jīng)典算法(5)---8—皇后問(wèn)題 2008-08-31 17:22 | LM
            學(xué)習(xí),謝謝  回復(fù)  更多評(píng)論
              
            久久无码专区国产精品发布| 久久久久亚洲AV无码专区首JN | 一本一道久久精品综合| 亚洲国产精品成人久久蜜臀| 亚洲欧美成人久久综合中文网 | 色天使久久综合网天天| 日韩乱码人妻无码中文字幕久久| 久久综合综合久久97色| 久久一区二区三区99| 久久精品国产免费一区| 国产精品久久久香蕉| 欧美日韩中文字幕久久久不卡| 日韩人妻无码精品久久免费一| 日韩久久无码免费毛片软件 | 久久亚洲精品成人AV| 久久久久高潮综合影院| 久久久久一级精品亚洲国产成人综合AV区| 狠狠色狠狠色综合久久| 久久久久亚洲av综合波多野结衣 | 久久人人爽人人爽人人片AV不 | 99久久国产免费福利| 久久国产色AV免费观看| 99久久er这里只有精品18| 久久久老熟女一区二区三区| 久久夜色精品国产网站| 久久精品黄AA片一区二区三区| 亚洲成色WWW久久网站| 人人狠狠综合久久亚洲88| 亚洲欧美日韩精品久久| 青青久久精品国产免费看| 久久人人青草97香蕉| 99久久er这里只有精品18| 久久久久亚洲av毛片大| 亚洲va久久久噜噜噜久久| 青青草国产精品久久| 日韩人妻无码一区二区三区久久99| 久久久无码人妻精品无码| 欧美日韩精品久久久久| 国产午夜精品久久久久免费视| 久久久WWW成人| 99久久99久久精品国产片|