今天學習了下回溯演算法,順便看了下經典案例:八皇后問題。
該問題是國際西洋棋棋手馬克斯·貝瑟爾於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皇后問題。本人...