• <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  評論-259  文章-1  trackbacks-0

            一、8皇后問題的分析   

             

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

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

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

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

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

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

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

            二、8皇后問題的算法  

             

            [算法]: 可以放置一個新皇后嗎?   [動畫]

                procedure Place(k)

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

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

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

                iß1

                while i<k do

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

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

                then return(false)

                endif

                ißi+1

                repeat

                return(true)

                end Place

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

               [算法]: n皇后問題的所有解   [動畫]

                procedure nqueens(n)

                //此過程使用回溯法求出在一個n*n棋盤上放置n個皇后,使其不能互相攻擊

                的所有可能位置//

                integer k,n,x(1:n)

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

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

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

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

                x(k)+x(k)+1

                repeat

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

                then if k=n //是一個完整的解嗎//

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

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

                endif

                else kßk-1 "回溯"

                endif

                repeat

                end nqueens

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

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

            查,即至多只檢查40320個8元組。

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

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

            [動畫]

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

            評論:
            # re: 經(jīng)典算法(5)---8—皇后問題 2007-06-22 23:25 | pass86
            記得以前學(xué)習(xí)的時候用了回溯的算法。  回復(fù)  更多評論
              
            # re: 經(jīng)典算法(5)---8—皇后問題 2007-06-22 23:45 | 星夢情緣
            我有回溯算法的,不過沒發(fā)上來  回復(fù)  更多評論
              
            # re: 經(jīng)典算法(5)---8—皇后問題 2007-06-26 17:36 | 匿名
            可以改進(jìn)一下,用4個全局的數(shù)組分別存放8行、8列、兩種斜線各15條上是否已經(jīng)放了皇后。 每放置或取走一個皇后,都改一下這四個數(shù)組。這樣判斷是否能放,4個條件就夠了,不用循環(huán)。  回復(fù)  更多評論
              
            # re: 經(jīng)典算法(5)---8—皇后問題 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ù)  更多評論
              
            # re: 經(jīng)典算法(5)---8—皇后問題 2008-08-31 17:22 | LM
            學(xué)習(xí),謝謝  回復(fù)  更多評論
              
            久久久久亚洲精品天堂| 热99re久久国超精品首页| 久久久免费观成人影院| 99久久国产主播综合精品| 热久久国产欧美一区二区精品| 一本综合久久国产二区| 久久精品国产99久久久| 国产精品欧美久久久久天天影视 | 精品综合久久久久久98| 亚洲欧美日韩中文久久| 成人午夜精品久久久久久久小说| 久久精品无码一区二区app| 久久精品中文字幕久久| 久久久高清免费视频| 国产精品99久久久久久猫咪| 久久人人青草97香蕉| 亚洲国产成人久久精品动漫| 久久久亚洲AV波多野结衣| 国产真实乱对白精彩久久| www.久久热| 久久99精品久久久久久久久久| 亚洲国产精品无码久久SM| 久久99精品免费一区二区| 77777亚洲午夜久久多喷| 一本色道久久综合狠狠躁| 中文字幕无码久久久| 99久久99久久精品国产| 久久国产热精品波多野结衣AV| 国产99久久久国产精品小说| 久久久精品国产亚洲成人满18免费网站 | 国产精品美女久久久网AV| 久久Av无码精品人妻系列| 久久这里的只有是精品23| 国产亚洲美女精品久久久| 亚洲精品国产成人99久久| 2021久久精品国产99国产精品| 中文字幕无码免费久久| 无遮挡粉嫩小泬久久久久久久| 久久久久亚洲精品日久生情| 人人妻久久人人澡人人爽人人精品| 久久综合亚洲色HEZYO国产 |