8皇后问题,要求:任意两皇后不能在同一行、列、斜线、反斜线上
直观解法:列出所有情况,判断是否符合要求。
缺点:共有8^8种方案要判断,明显太多太麻烦。
思路:考虑减少要判断的情况,边放子边判断,若落下该子明显不合题意,则跳过考虑下一情况。
解法:回溯法,每落一子判断该位置正确性。
代码:
package com.zxy.exercise;
public class Main {
static int count = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
eightQueen();
}
public static void eightQueen(){
int[] board = new int[8];
for(int i = 0; i < 8; i++)
board[i]= 0;
eightQueenCore(0, board);
}
public static void eightQueenCore(int index, int[] board){
for(int i = 1; i <= 8; i++){
if(checkPos(index, i, board)){
board[index] = i;
if(index != 7)
eightQueenCore(index + 1, board);
else
printBoard(board);
}
}
}
public static boolean checkPos(int index, int value, int[]board){
for(int i = 0; i < index; i++){
if(board[i] == value)
return false;
if((i + board[i]) == (index + value)) //判断两点是否在同一反斜线
return false;
if((i - board[i]) == (index - value)) //判断两点是否在同一斜线
return false;
}
return true;
}
public static void printBoard(int[] board){
count++;
System.out.print(count + ": ");
for(int i = 0; i < board.length; i++)
System.out.print(board[i] + " ");
System.out.println();
}
}
回溯法是常规解法,不知是否有更好的解法呢?