八皇后和N皇后

题目:

八皇后问题是一个以国际象棋为背景的问题:如何能够在 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方法中是题目三个条件的代码转换(任两个皇后都不能处于同一条横行、纵行或斜线上)

发布了16 篇原创文章 · 获赞 0 · 访问量 227

猜你喜欢

转载自blog.csdn.net/qq_44713502/article/details/103262706