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

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

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

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

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

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

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

            二、8皇后問題的算法  

             

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

                procedure Place(k)

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

                個全程數組,進入此過程時已置了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來改進以上算法給出的一般回溯方法,可得出下面求n皇后問題正確解的算法。

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

                procedure nqueens(n)

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

                的所有可能位置//

                integer k,n,x(1:n)

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

                whilek>0 do //對所有的行執行以下語句//

                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) //是,打印這個數組//

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

                endif

                else kßk-1 "回溯"

                endif

                repeat

                end nqueens

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

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

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

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

             因此不受限結點的估計數大約只是8皇后狀態空間樹的結點總數的2.34%。

            [動畫]

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

            評論:
            # re: 經典算法(5)---8—皇后問題 2007-06-22 23:25 | pass86
            記得以前學習的時候用了回溯的算法。  回復  更多評論
              
            # re: 經典算法(5)---8—皇后問題 2007-06-22 23:45 | 星夢情緣
            我有回溯算法的,不過沒發上來  回復  更多評論
              
            # re: 經典算法(5)---8—皇后問題 2007-06-26 17:36 | 匿名
            可以改進一下,用4個全局的數組分別存放8行、8列、兩種斜線各15條上是否已經放了皇后。 每放置或取走一個皇后,都改一下這四個數組。這樣判斷是否能放,4個條件就夠了,不用循環。  回復  更多評論
              
            # re: 經典算法(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 /*定義數組的大小*/
            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<<"} 隊列"<<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;
            }
              回復  更多評論
              
            # re: 經典算法(5)---8—皇后問題 2008-08-31 17:22 | LM
            學習,謝謝  回復  更多評論
              
            亚洲级αV无码毛片久久精品| 99热热久久这里只有精品68| 久久久人妻精品无码一区| 久久国产视频网| 99久久免费国产精品特黄| 久久久久免费看成人影片| 久久国产乱子伦精品免费强| 热RE99久久精品国产66热| 亚洲乱码精品久久久久..| 99久久免费只有精品国产| 免费无码国产欧美久久18| 久久96国产精品久久久| 亚洲精品99久久久久中文字幕 | 久久综合综合久久97色| 亚洲国产天堂久久久久久| 国产精品无码久久久久久| 久久伊人五月天论坛| 国产精品一久久香蕉国产线看| 中文字幕无码久久精品青草| 久久99精品综合国产首页| 亚洲天堂久久久| 久久影视综合亚洲| 天天久久狠狠色综合| 狠狠色丁香久久婷婷综合五月| 日韩一区二区三区视频久久| 97久久久久人妻精品专区| 国产毛片欧美毛片久久久| 欧美日韩精品久久久免费观看| yellow中文字幕久久网| 好久久免费视频高清| 久久久亚洲欧洲日产国码二区| 狠狠色丁香久久婷婷综合蜜芽五月 | 久久久久国产精品麻豆AR影院| 精品乱码久久久久久久| 亚洲国产精品一区二区久久hs| 无码人妻少妇久久中文字幕| 久久99久久无码毛片一区二区| 99热都是精品久久久久久| 国产高潮国产高潮久久久91| 久久免费美女视频| 青草影院天堂男人久久|