八皇后問題的最佳解決方案_第1頁
八皇后問題的最佳解決方案_第2頁
八皇后問題的最佳解決方案_第3頁
八皇后問題的最佳解決方案_第4頁
八皇后問題的最佳解決方案_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2算法設(shè)計(jì)與分析報(bào)告3算法設(shè)計(jì)與分析試驗(yàn)報(bào)告八皇后問題的最佳解決方案回溯法概述1

內(nèi)容提要八皇后問題2解決八皇后問題常用算法3算法分析與總結(jié)4回溯法概述1一回溯法回溯法實(shí)際是一個(gè)類似枚舉的搜尋嘗試方法,它的主題思想是在搜尋嘗試中找問題的解,當(dāng)不滿足求解條件就”回溯”(返回),嘗試別的路徑?;厮菟惴ㄊ菄L試搜尋算法中最為基本的一種算法,其接受了一種“走不通就掉頭”的思想,作為其限制結(jié)構(gòu)。本文主要描述遞歸回溯與非遞歸回溯,并用這兩個(gè)算法解決經(jīng)典的“八皇后”問題,找出該問題的最佳解決方案。八皇后問題描述2二八皇后問題描述:八皇后問題:要在8*8的國(guó)際象棋棋盤中放八個(gè)皇后,使隨意兩個(gè)皇后都不能相互吃掉。規(guī)則:皇后能吃掉同一行、同一列、同一對(duì)角線的隨意棋子。如圖2-1為一種方案,求全部的解。:圖2-1解決八皇后問題常用算法3三

解決八皇后問題常用的算法:

枚舉法解決八皇后問題3.1非遞歸回溯法解決八皇后問題3.2遞歸回溯法解決八皇后問題3.2這是一種最簡(jiǎn)潔的算法,通過八重循環(huán)模擬搜尋空間中的88個(gè)狀態(tài),按深度優(yōu)先思想,把第1個(gè)皇后放在第1列,然后起先搜尋第2到第8個(gè)皇后的合理位置,每個(gè)皇后只能在同一行的8個(gè)位置存放,每前進(jìn)一步檢查是否滿足約束條件,不滿足時(shí),檢查下一個(gè)位置,若滿足約束條件,起先下一個(gè)皇后的合理位置檢查,直到找出8個(gè)皇后的全部合理位置(即問題的全部解)。枚舉法解決八皇后問題3.13.1枚舉算法解決八皇后問題:概述:不在同一列的表達(dá)式為:xi≠xj;不在同一主對(duì)角線上的表達(dá)式為:xi-ixj-j;不在同一負(fù)對(duì)角線上的表達(dá)式為:xi+i≠xj+j.

枚舉法解決八皇后問題3.1②約束條件算法描述

枚舉法解決八皇后問題3.1Main1(){inta[9];//初始化定義數(shù)組for(x1=1;x1<=8;x1++)//從第一列起先搜尋for(x2=1;x2<=8;x2++){if(check(x2,2)=0)continue;//假如約束條件滿足,則執(zhí)行下一個(gè)for語句,否則當(dāng)前皇后位置向右移動(dòng)一位接著檢查約束條件for(x3=1;x3<=8;x3++){if(check(x3,3)=0)continue;//同上for(x4=1;x4<=8;x4++){if(check(x4,4)=0)continue;//同上for(x5=1;x5<=8;x5++){if(check(x5,5)=0)continue;//同上for(x6=1;x6<=8;x6++){if(check(x6,6)=0)continue;//同上枚舉法解決八皇后問題3.1for(x7=1;x7<=8;x7++){if(check(x7,7)=0)continue;//同上for(x8=1;x8<=8;x8++)//同上{if(check(x8,8)=0)continue;//同上else//找到了一組解for(i=1;i<=8;i++)//輸出一組滿足約束的解print(xi);}}}}}}}}check(intxi,intn)//該函數(shù)是用來推斷是否滿足約束{inti;for(i=1;i<=n-1;i++)//這里只須要推斷前n-1個(gè)if(abs(xi-xn)=abs(i-n))or(xi=xn)//推斷是否同一列或者同一對(duì)角線return(0);return(1);}非遞歸回溯法解決八皇后問題3.23.2非遞歸回溯解決八皇后問題:算法1的枚舉算法可讀性很好,但它只能解決八皇后問題,而不能解決隨意的n皇后問題。因此不是通用的回溯算法。下面的非遞歸算法可以說是通用的n皇后問題算法模型。概述:②算法描述非遞歸回溯法解決八皇后問題3.2ta[20],n;Main2(){input(n);bckdate(n);}//初始化,輸入皇后數(shù)目backdate(intn)//該函數(shù)是用來找尋滿足約束的全部解{intk;a[1]=0;k=1;//k用來表示第k個(gè)皇后while(k>0){a[k]=a[k]+1;while((a[k]<=n)and(check(k)=0))//搜尋第k個(gè)皇后位置a[k]=a[k]+1;if(a[k]<=n)if(k=n)output(n);//找到一組解/else{k=k+1;//接著為第k+1個(gè)皇后找到位置/a[k]=0;}//留意下一個(gè)皇后確定要從頭起先搜尋/elsek=k-1;//回溯}}非遞歸回溯法解決八皇后問題3.2check(intk)//檢查皇后是否滿足約束{inti;for(i=1;i<=k-1;i++)if(abs(a[i]-a[k])=abs(i-k))or(a[i]=a[k])return(0);return(1);}output()//輸出滿足該約束下的一組皇后位置{inti;for(i=1;i<=n;i++)print(a[i]);}遞歸回溯法解決八皇后問題3.23.3遞歸回溯解決八皇后問題:概述:對(duì)于回溯算法,更便利地是用遞歸限制方式實(shí)現(xiàn),這種方式也可以解決隨意的n皇后問題,算法的思想同樣用深度優(yōu)先搜尋,在不滿足約束條件時(shí)剛好回溯。與上面兩個(gè)算法不同,都是用check()函數(shù)來檢查當(dāng)前狀態(tài)是否滿足約束條件,由于遞歸調(diào)用、回溯的整個(gè)過程是非線性的,用check()函數(shù)來檢查當(dāng)前狀態(tài)是否滿足約束條件是不充分的,而用check()函數(shù)(在算法1中說明)來檢查當(dāng)前狀態(tài)是否滿足約束條件又有太多冗余。這里,我們“利用數(shù)組記錄狀態(tài)信息”的技巧,用三個(gè)數(shù)組c,b,d分別記錄棋盤上的n個(gè)列、2n-1個(gè)主對(duì)角線和2n-1個(gè)負(fù)對(duì)角線的占用狀況。②算法描述遞歸回溯法解決八皇后問題3.2inta[20],b[20],c[40],d[40];intn,t,i,j,k;//t記錄解的個(gè)數(shù),i限制行,j限制列main(){inti,input(n);//輸入皇后的個(gè)數(shù)for(i=1;i<=n;i++){b[i]=0;//記錄棋盤n個(gè)列c[i+1]=0;c[n+i]=0;//記錄棋盤負(fù)對(duì)角線d[i]=0;d[n+i-1]=0;//記錄棋盤主對(duì)角線}try(1);}遞歸回溯法解決八皇后問題3.2try(inti){intj;for(j=1;j<=n;j++)//j表示列號(hào),第i個(gè)皇后有n種可能位置if(b[j]=0)and(c[i+j]=0)and(d[i-j+n]=0)//推斷位置是否沖突{a[i]=j;//第i行第j列可以擺放編號(hào)為i的皇后b[j]=1;//占據(jù)第j列c[i+j]=1;d[i-j+n]=1;//占據(jù)兩個(gè)對(duì)角線if(i<n)try(i+1);//n個(gè)皇后沒有擺完,遞歸擺放下一皇后elseoutput();//完成任務(wù),打印結(jié)果b[j]=0;c[i+j]=0;d[i-j+n]=0;//回溯,清理現(xiàn)場(chǎng),從低向上回溯}}output(){t=t+1;//這里的t只是用來統(tǒng)計(jì)滿足條件的解的個(gè)數(shù)print(t,'');for(k=1;k<=n;k++)print(a[k],'

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論