递归应用--八皇后java解决

来源:互联网 发布:开机出现3个windows 编辑:程序博客网 时间:2024/04/28 21:03
<span style="font-size:18px;">package day5;public class EightQueen {public static int num = 1;public void Queen(int queenNum) {String queenLocation[][] = new String[queenNum][queenNum];int c[] = new int[queenNum];//存放皇后所在的列标advance(0, queenNum, c, queenLocation);}private void advance(int k, int queenNum, int c[], String queenLocation[][]) {for (int col = 0; col < queenNum; col++) {c[k] = col;//列标if (isSafe(c, k)) {if (k == queenNum - 1) {init(queenLocation);for (int i = 0; i < queenNum; i++)// 填充棋盘{queenLocation[i][c[i]] = "X";}printQueen(queenLocation, num++);// 打印出当前的可行方案} else {advance(k + 1, queenNum, c, queenLocation);}}}}private boolean isSafe(int c[], int currentQueenNum) {// 当前是第几个皇后,当前和皇后依次和前面的皇后比较// currentQueenNum表示当前是第几个皇后if (currentQueenNum == 0)return true;else {for (int i = 0; i < currentQueenNum; i++) {if (c[i] == c[currentQueenNum]|| (c[i] - c[currentQueenNum]) == (i - currentQueenNum)|| (c[i] - c[currentQueenNum]) == (currentQueenNum - i))return false;}return true;}}/** * 对棋盘的初始化 *  * @param queenLocation */private void init(String[][] queenLocation) {int n = queenLocation.length;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {queenLocation[i][j] = "0";}}}/** * 打印棋盘 *  * @param queenLocation * @param num */private void printQueen(String[][] queenLocation, int num) {int n = queenLocation.length;String queenString = "";for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (j == (n - 1)) {queenString += queenLocation[i][j] + "\n";} else {queenString += queenLocation[i][j] + "   ";}}}System.out.println("第" + num + "种解决方案:");System.out.println(queenString);}public static void main(String[] args) {EightQueen queen = new EightQueen();int queenNumber = 8;// 皇后数量queen.Queen(queenNumber);}}</span>

0 0
原创粉丝点击