题目:
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 ≥ 1 或 n1 ≥ 4 时问题有解。
java代码:
import java.util.Scanner;
public class Main{
static int t;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[][] board=new int[n][n];
nQuees(board,0);
System.out.println(t);
}
static void nQuees(int[][] board,int row) {
if(row==board.length) {
t++;
return;
}
for(int col=0;col<board.length;col++) {
if(isValid(board,row,col)) {
board[row][col]=1;
nQuees(board,row+1);
board[row][col]=0;
}
}
}
static boolean isValid(int[][] board,int row,int col) {
for(int i=0;i<row;i++)
if(board[i][col]==1)return false;
for(int i=row-1,j=col-1;i>=0 && j>=0;i--,j--)
if(board[i][j]==1)return false;
for(int i=row-1,j=col+1;i>=0 && j<board.length;i--,j++)
if(board[i][j]==1)return false;
return true;
}
}
解题思路:
用递归进行暴力求解(2s内最多可求12皇后)
nQuees(board,0):
将棋盘大小和从第 0 row开始,传入递归方法中
if(row==board.length) :
设置递归出口,当结果为true时,说明棋盘每行都有一个符合条件的皇后,即题目的一种解
if(isValid(board,row,col)):
判断在board[row][col]上放置皇后是否满足条件,如果满足则将board[row][col]的值改为1,表示在row行上的皇后在col列上,然后对下一行进行选择。当这一board选择完以后需要对board进行还原,也就是board[row][col]改为0,board选择完可能在任意行(当某row所有col都不满足条件或所有行都有皇后即为board选择完)
isValid方法中是题目三个条件的代码转换(任两个皇后都不能处于同一条横行、纵行或斜线上)