遞迴解法的基本原理是把乙個大問題拆分成幾個類似的小問題,小問題繼續拆解成更小的問題,直到不能拆解的單元問題為止,再把所有單元問題的解匯集成問題的全部解。就八皇后問題而言,可以先擺第一列,共八種位置選中,每種位置選擇下,剩餘的八行七列中繼續擺放其他皇后,即變成了八個「八行七列棋盤擺七個皇后問題」的解的集合;八行七列的棋盤裡面,擺第二列,剩餘八行六列的棋盤,以此類推,直到最後一列擺上皇后。同樣的,不僅八皇后,任意多個皇后的擺放問題都可以用這種方法求解。
本功能採用c#來實現
using system;
using system.collections.generic;
using system.linq;
using system.windows.forms;
namespace eightqueens
private void btn_click(object sender, eventargs e)//控制項事件
else
}catch
}private static list> eightqueens(int num, icollectionselectedlocation)//遞迴方法,num為皇后總數,selectedlocation為前面已經選定的位置);}
else if(num >3)//皇后數超過3時,遞迴
var selectinglocation = selectedlocation.select(x => x).tolist();
selectinglocation.add(i + 1);
if (canbearranged(selectinglocation) == false)//判斷能否布置
if (selectinglocation.count == num)//全部布置完
);break;
}else//布置當前這乙個皇后,同時進入下一次遞迴}}
return results;
}private static bool canbearranged(ireadonlylistresultarray)//判別能否布置,能輸出true,不能輸出false
}return true;
}private static listaddelement(t selectingnum, listlastresult)//給list前端插入乙個元素}}
介面如下圖所示:
使用者可以在介面上輸入皇后數量,在擺法總數那裡檢視總共擺法數量。當皇后數為8時,結果如下:
使用者也可以設斷點檢視具體的擺法。
題解 八皇后問題
是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了40種不同的...
八皇后問題詳細解法
問題描述 在 8 8的棋盤上,放置8個 皇后 棋子 使兩兩之 間互不攻擊。所謂互不攻擊是說任何兩個皇后都要滿足 1 不在棋盤的同一行 2 不在棋盤的同一列 3 不在棋盤的同一對角線上。求 這8個皇后中的每乙個 應該擺放在哪一列。演算法分析 陣列 column down up 分別用來標記衝突,col...
八皇后問題 之全排列解法
問題的分解一共有兩步 1.生成問題的所有候選解空間 2.過濾掉那些不滿足要求的細化這兩步,需要認識到下面兩點 1.八皇后所有候選解空間是 1,2,3,4,5,6,7,8 這個集合中元素的全排列 這個全排列不僅列出了候選解,並且還自動規避掉了皇后在橫 豎方向上攻擊的問題 2.接下來八皇后相互攻擊的問題...