N皇后问题
问题描述
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法,这称为八皇后问题。
延伸一下,便为N皇后问题。
核心思想
解决N皇后问题有两个关键点。一是如何进行放置棋子,二是如何验证棋子是否符合要求。
因此,我们利用回溯法建立函数。
private static void NQueen(LinkedList<Location> list, int x, int y) {
if(list.size() == SIZE){
//当list元素个数为SIZE时,表示SIZE个皇后都摆放完毕,打印后即可退出函数。
printLocation(list); //打印皇后摆放方式
return ;
}
for(int i = x ; i < SIZE ; i++){
Location loc = new Location(i, y);
if(isLegalLoc(list, loc)){
list.offer(loc); //将第y列的皇后摆放好
NQueen(list, 0, y+1); //开始摆放y+1列的皇后,同样从第0列开始摆放
list.pollLast(); //每次摆放完一个皇后后,都要将其撤回,再试探其它的摆法。
}
}
}
/**
* 判断位置为loc的皇后是否合法
*/
private static boolean isLegalLoc(LinkedList<Location> list, Location loc) {
for(Location each : list){
if(loc.x == each.x