亚洲网站在线免费观看,欧美性运动视频免费观看网站,国产精品爽爽久久,熟女少妇丰满一区二区

問答

N皇后問題的回溯法求解屬于子集樹還是排列樹 詳細講一講

提問者:okiek9597442016-06-19 00:00

N皇后的算法求解用的是子集樹的算法框架,但是可以只憑這個就確定嗎? 希望能詳細講一講。還有子集樹跟排列樹都舉幾個例子。謝謝。

最佳答案

“八皇后”問題遞歸法求解 (Pascal語言) 八皇后問題是一個古老而著名的問題,是回溯算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出:在8X8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜志上不同的作者發表了40種不同的解,后來有人用圖論的方法解出92種結果。現代教學中,把八皇后問題當成一個經典遞歸算法例題。 算法分析:數組a、b、c分別用來標記沖突,a數組代表列沖突,從a[0]~a[7]代表第0列到第7列,如果某列上已經有皇后,則為1,否則為0;數組b代表主對角線沖突,為b[i-j+7],即從b[0]~b[14],如果某條主對角線上已經有皇后,則為1,否則為0;數組c代表從對角線沖突,為c[i+j],即從c[0]~c[14],如果某條從對角線上已經有皇后,則為1,否則為0;另優化:第一個皇后在1~4格,最后*2,即為總解數 } program queens; var a:array [1..8] of integer; b,c,d:array [-7..16] of integer; t,i,j,k:integer; procedure print; begin t:=t+1; write(t,': '); for k:=1 to 8 do write(a[k],' '); writeln; end; procedure try(i:integer); var j:integer; begin for j:=1 to 8 do {每個皇后都有8種可能位置} if (b[j]=0) and (c[i+j]=0) and (d[i-j]=0) then {判斷位置是否沖突} begin a:=j; {擺放皇后} b[j]:=1; {宣布占領第J行} c[i+j]:=1; {占領兩個對角線} d[i-j]:=1; if i<8 then try(i+1) {8個皇后沒有擺完,遞歸擺放下一皇后} else print; {完成任務,打印結果} b[j]:=0; {回溯} c[i+j]:=0; d[i-j]:=0; end; end; begin fillchar(a,sizeof(a),0); {初始化數組} fillchar(b,sizeof(b),0); fillchar(c,sizeof(c),0); fillchar(d,sizeof(d),0); try(1);{從第1個皇后開始放置} end. “八皇后”問題遞歸法求解 (C語言) #i nclude "stdio.h" static char Queen[8][8]; static int a[8]; static int b[15]; static int c[15]; static int iQueenNum=0; //記錄總的棋盤狀態數 void qu(int i); //參數i代表行 int main() { int iLine,iColumn; //棋盤初始化,空格為*,放置皇后的地方為@ for(iLine=0;iLine<8;iLine++) { a[iLine]=0; //列標記初始化,表示無列沖突 for(iColumn=0;iColumn<8;iColumn++) Queen[iLine][iColumn]='*'; } //主、從對角線標記初始化,表示沒有沖突 for(iLine=0;iLine<15;iLine++) b[iLine]=c[iLine]=0; qu(0); return 0; } void qu(int i) { int iColumn; for(iColumn=0;iColumn<8;iColumn++) { if(a[iColumn]==0&&b[i-iColumn+7]==0&&c[i+iColumn]==0) //如果無沖突 { Queen[iColumn]='@'; //放皇后 a[iColumn]=1; //標記,下一次該列上不能放皇后 b[i-iColumn+7]=1; //標記,下一次該主對角線上不能放皇后 c[i+iColumn]=1; //標記,下一次該從對角線上不能放皇后 if(i<7) qu(i+1); //如果行還沒有遍歷完,進入下一行 else //否則輸出 { //輸出棋盤狀態 int iLine,iColumn; printf("第%d種狀態為:
",++iQueenNum); for(iLine=0;iLine<8;iLine++) { for(iColumn=0;iColumn2)this.width=screen.width/2" vspace=2 border=0>; } printf("

"screen.width/2)this.width=screen.width/2" vspace=2 border=0>; } //如果前次的皇后放置導致后面的放置無論如何都不能滿足要求,則回溯,重置 Queen[iColumn]='*'; a[iColumn]=0; b[i-iColumn+7]=0; c[i+iColumn]=0; } } } 八皇后的c語言解法: #include #include #include int n,k,a[20],num=0; int attack(int k){ int flag=0; int i=1; while ((i");} else { for (i=1;i"); getch(); }

回答者:wd1000062016-06-21 00:00

相關問題

  • 8皇后問題用回溯法有幾種解法呢?《過程》

    這樣算是最佳解 class Queen8{ static final int QueenMax = 8; static int oktimes = 0; static int chess[]

    提問者:lwl20085202014-07-10

  • 回溯法求N皇后問題時間復雜度是不是O(n^n)

    沒有那么多,就是不加斜線約束,由于不能同行同列,因此也最多只是O(n!)

    提問者:symnBallflumn2013-09-11

  • 關于新西蘭自駕游過程中給汽車加油問題

    新西蘭加油站很多,但我還是建議保證起碼半箱油,因為好幾百里見不到加油站的情況也是常有的。還有大城市油價會較便宜,越往南越貴。新西蘭一般是91號汽油和柴油,自駕所開的汽車就加91號汽油。99%加油站都是自助加油,輸入需要加

    提問者:halleyshi2016-07-25

  • 關于汽車加油常見問題詳解

    我發現成為車主后出現的問題會有很多,接下來我們就來說說有關于汽車加油的幾個常見的問題。加92號還是95號好呢?92號與95號本質上有什么區別呢?其實區別主要在抗爆性,95號汽油的抗爆性比92號強,抗爆性越強,發動機的點火

    提問者:qwe79397922016-10-08

  • PHP回溯法解決0-1背包問題實例分析

    本文實例講述了PHP回溯法解決0-1背包問題的方法。分享給大家供大家參考。具體分析如下: 這段代碼是根據《軟件設計師》教程的偽代碼寫的; 最麻煩的不是偽代碼改成php,而是數組下標從0開始,及相應的下標判斷問題;

    提問者:Angelqingbb2016-04-19

  • 用遞歸回溯法設計旅行售貨員問題的算法?

    一、回溯法: 回溯法是一個既帶有系統性又帶有跳躍性的的搜索算法。它在包含問題的所有解的解空間樹中,按照深度優先的策略,從根結點出發搜索解空間樹。算法搜索至解空間樹的任一結點時,總是先判斷該結點是否肯定不包含問題的解。

    提問者:gh1616162013-06-21

車友關注

最新標簽

按字母分類:
ABCDEFGHIJKLMNOPQRSTWXYZ0-9