资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
From GossipcaterpillarAlgorithm Gossip: 八個皇后八個皇后說明說明西洋棋中的皇后可以直線前進,吃掉遇到的所有棋子,如果棋盤上有八個皇后,則這八個皇后如何相安無事的放置在棋盤上,1970 年與 1971 年, E.W.Dijkstra 與 N.Wirth 曾經用這個問題來講解程式設計之技巧。解法解法關於棋盤的問題,都可以用遞迴求解,然而如何減少遞迴的次數?在八個皇后的問題中,不必要所有的格子都檢查過,例如若某列檢查過,該該列的其它格子就不用再檢查了,這個方法稱為分支修剪。 所以檢查時,先判斷是否在已放置皇后的可行進方向上,如果沒有再行放置下一個皇后,如此就可大大減少遞迴的次數,例如以下為修剪過後的遞迴檢查行進路徑:八個皇后的話,會有 92 個解答,如果考慮棋盤的旋轉,則旋轉後扣去對稱的,會有 12 組基本解。 實作實作C #include #include #define N 8 int columnN+1; / 同欄是否有皇后,1 表示有 int rup2*N+1; / 右上至左下是否有皇后 int lup2*N+1; / 左上至右下是否有皇后 int queenN+1 = 0; int num; / 解答編號 void backtrack(int); / 遞迴求解 int main(void) int i; num = 0; for(i = 1; i N) showAnswer(); else for(j = 1; j 8) showAnswer(); else for(int j = 1; j = 8; j+) if(columnj = 1 / 設定為佔用columnj = rupi+j = lupi-j+8 = 0; backtrack(i+1); columnj = rupi+j = lupi-j+8 = 1; protected void showAnswer() num+;System.out.println(“n 解答 “ + num);for(int y = 1; y = 8; y+) for(int x = 1; x = 8; x+) if(queeny = x) System.out.print(“ Q“);else System.out.print(“ .“);System.out.println();public static void main(String args) Queen queen = new Queen();queen.backtrack(1);
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号