博客
关于我
n皇后问题
阅读量:796 次
发布时间:2023-02-17

本文共 1942 字,大约阅读时间需要 6 分钟。

看剑指offer时,看到全排列算法,后面的扩展引申,说可以用此思路解决8皇后问题,我就改成了解决n皇后问题。

之前出现函数参数值传递还是引用传递问题,就是由于此代码出问题引发的思考。

代码如下:

public class QueenProblem {	/*	 * 不同行的皇后不能在同一列,且任意两个皇后不能在同一对角线上	 */	public static void main(String[] args) {		// TODO Auto-generated method stub		QueenProblem question = new QueenProblem();		int n = 4;		int count = question.counOfQueenProblem(n);		System.out.println(n + "皇后问题共有 "+ count + " 种解法。");	}	// 初始化皇后的位置	// 譬如queens[i] = j,表示第i行的皇后在第j列	//这种初始化保证了不同皇后不可能在同一行,而对于列值,只进行交换操作,保证了不同皇后不可能在同一列	public int counOfQueenProblem(int numberOfQueens) {		if (numberOfQueens < 4)			return 0;		else {			int[] queens = new int[numberOfQueens];			for (int i = 0; i < numberOfQueens; i++)				queens[i] = i;			return countsOfQueenPlace(queens, 0);		}	}	public int countsOfQueenPlace(int[] queens, int index) {		int count = 0;		if (index == queens.length - 1) {			boolean flag = true;			for (int i = 0; i < queens.length; i++) {				for (int j = 0; j < queens.length; j++) {					if (i != j) {						//判断是否有两个皇后在同一对角线上						if (i - j == queens[i] - queens[j]								|| j - i == queens[i] - queens[j]) {							flag = false;							break;						}					}				}				if (!flag)					break;			}			if (flag) {				printQueens(queens);				count++;			}		} else {			for (int i = index; i < queens.length; i++) {				swap(queens, index, i);				count += countsOfQueenPlace(queens, index + 1);				swap(queens, i, index);			}		}		return count;	}	void swap(int[] array, int index1, int index2) {		int temp = array[index1];		array[index1] = array[index2];		array[index2] = temp;	}	void printQueens(int[] queens) {		for (int i = 0; i < queens.length; i++) {			for (int j = 0; j < queens[i]; j++) {				System.out.print("*");			}			System.out.println("Q");		}		System.out.println("========================");	}}
下面是4皇后问题的输出结果:

*Q***QQ**Q========================**QQ***Q*Q========================4皇后问题共有 2 种解法。
只需要改变主函数中 n 的值,便可求出对应 n皇后问题 的解,篇幅有限,只展示下 4皇后问题的结果, 但是n值若是太大应该会出问题,毕竟是使用递归做的。

转载地址:http://nknfk.baihongyu.com/

你可能感兴趣的文章
Qt之QImage无法获取图片尺寸(宽和高)
查看>>
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
查看>>
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED
查看>>
Java-类加载过程
查看>>
BUU-MISC-认真你就输了
查看>>
BUU-MISC-caesar
查看>>
【专题2:电子工程师 之 上位机】 之 【36.事件重载】
查看>>
【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
查看>>
一文学会JVM常见参数设置+调优经验(JDK1.8)
查看>>
一文理解设计模式--命令模式(Command)
查看>>
VTK:可视化之RandomProbe
查看>>
block多队列分析 - 2. block多队列的初始化
查看>>
Java时间
查看>>
不编译只打包system或者vendor image命令
查看>>
MySQL
查看>>
The wxWindows Library Licence (WXwindows)
查看>>
leetcode——第203题——虚拟头结点
查看>>
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
查看>>
MySQL----基础及常用命令
查看>>
模拟集成:MOS管的工作区小误区(简单版)
查看>>