回溯演算法 八皇后

2021-08-02 20:17:26 字數 1598 閱讀 1542

今天學習了下回溯演算法,順便看了下經典案例:八皇后問題。

該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
回溯演算法的搜尋邏輯是深度優先,即,從一條路往前走,能進則進,不能進則退回來,換一條路再試。

先直接曬**:

/**

* created by cxx on 2017/6/20.

*/public

class

myqueen

//遍歷-深度優先

public

void

backtrack(int i)

}}else

}//遊戲規則->轉成數學問題->程式

public

boolean

iskilled(int i , int j)

}return

true;

}//輸出解空間

public

void

showresult()else

}system.out.println();

}num++;

}public

static

void

main(string args)

}

首先定**空間:int result。

使用int簡化輸出結果集,儲存著每行皇后所處位置的下標。result[0] =5 表示第一行皇后位於索引下表為5的位置(.....*..);
然後開始遍歷,目的是組織解空間,即,給result賦值。

逐行遍歷,找到該行的皇后後,立即動身尋找下一行的皇后,以先找出乙個完整的result為優先(深度優先)。湊不出乙個result就捨棄(每個result的i必須湊到8,不足的則捨棄)。找到後回來繼續遍歷。
遍歷的篩選條件從題目中來,轉化成數學模型即三個簡單的函式:

y=x+k(正斜線)

y=-x+k(反斜線)

y=k(豎線)

由於橫向遍歷,所以無需考慮會在同一條橫線上的情況。滿足三個函式任意,即皇后可互相攻擊,就捨棄。

執行結果:

解:1

*.......

....*...

.......*

.....*..

..*.....

......*.

.*......

...*....

解:2*.......

.....*..

.......*

..*.....

......*.

...*....

.*......

....*...

解:3*.......

......*.

...*....

.....*..

.......*

.*......

....*...

..*.....

回溯演算法 八皇后

總時間限制 1000ms 記憶體限制 65536kb 描述 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b 1b2....

八皇后演算法(回溯)

演算法描述 八皇后是一道很具典型性的題目。它的基本要求是這樣的 在乙個8 8的矩陣上面放置8個物體,乙個矩陣點只允許放置乙個物體,任意兩個點不能在一行上,也不能在一列上,不能在一條左斜線上,當然也不能在一條右斜線上。八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數...

八皇后問題(回溯演算法)

八皇后問題是古老的問題,十八世紀由乙個西洋棋手提出的,即在乙個8 8 的西洋棋盤上,放置八個皇后,使它們不能相互攻擊到。即不能處於同一行,同一列,也不能處於同一條斜線上,問有多少種擺法。八皇后問題是經典的回溯演算法問題,後人利用計算機,算出了8 8 的棋盤上能擺出92種,而後又提出了n皇后問題。本人...