Queen 八皇后问题 回溯经典解法
2013-09-19 00:55
423 查看
/* 八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。 @author arhaiyun 2013/09/19 */ public class Queen { //初始化为0表示该行对应位置所处的列上没有queen private int[] column; //初始化为0表示该行对应位置所处的右对角线上上没有queen private int[] rightup; //初始化为0表示该行对应位置所处的左对角线上列上没有queen private int[] leftup; //Queue位置记录 private int[] queen; private static int num = 0; Queen() { column = new int[8 + 1]; rightup = new int[2 * 8 + 1]; leftup = new int[2 * 8 + 1]; queen = new int[8 + 1]; for(int i = 1; i <= 8; i++) queen[i] = column[i] = 0; for(int i = 0; i <= 2 * 8; i++) rightup[i] = leftup[i] = 0; } public void backtrack(int i) { if(i > 8) { showResult(); } else { for(int j = 1; j <= 8; j++) { if(column[j] == 0 && rightup[9 - i + j] == 0 && leftup[i + j] == 0) { //放置皇后 queen[i] = j; column[j] = rightup[9 - i + j] = leftup[i + j] = 1; //回溯遍历 backtrack(i + 1); column[j] = rightup[9 - i + j] = leftup[i + j] = 0; } } } } protected void showResult() { num++; System.out.println("\nResolution:"+num); for(int i = 1; i <= 8; i++) { for(int j = 1; j <= 8; j++) { if(queen[i] == j) { System.out.print(" Q"); } else { System.out.print(" ."); } } System.out.println(); } } public static void main(String[] args) { Queen queen = new Queen(); queen.backtrack(1); } }
相关文章推荐
- 从经典的八皇后问题看回溯
- 【C/C++】回溯经典算法之-->八皇后问题
- 【算法入门经典】7.4回溯法【八皇后问题】
- 递归与回溯之经典八皇后问题
- 递归--基于回溯和递归的八皇后问题解法
- 回溯经典问题之八皇后问题
- 经典问题“八皇后”的解法
- 回溯法经典问题-八皇后
- 经典回溯八皇后问题--递归
- 经典问题“八皇后”的解法
- 经典回溯问题-八皇后
- 八皇后问题回溯解法
- 八皇后问题(经典回溯算法)
- 回溯法:应用举例--八皇后问题
- 经典算法之八皇后问题
- 八皇后问题的高效解法-递归版
- 八皇后问题:递归和非递归解法
- 八皇后问题DFS解法
- 算法学习笔记(二)——01背包问题之回溯解法
- 八皇后问题的高效解法-递归版(转)