博客
关于我
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/

你可能感兴趣的文章
无法打开文件“opencv_world330d.lib”的解决办法
查看>>
maven项目出现 Missing artifact jdk.tools:jdk.tools:jar:1.7
查看>>
maven项目通过Eclipse上传到svn上面,再导入到本地出现指定的类找不到的问题
查看>>
maven 项目部署到tomcat下 没有class文件
查看>>
算法训练 未名湖边的烦恼(递归,递推)
查看>>
算法训练 完数(循环,数学知识)
查看>>
什么是接口
查看>>
2020版nodejs12.18.3安装配置教程
查看>>
iview组件库中,Form组件里的Input,无法正确绑定on-enter事件
查看>>
记录-基于springboot+vue.js实现的超大文件分片极速上传及流式下载
查看>>
JavaScript高级程序设计第四版学习记录-第九章代理与反射
查看>>
怎么解决Windows 10文件/文件夹正在使用无法删除
查看>>
F28335第九篇——通用IO
查看>>
STM32F429第十一篇之数据类型
查看>>
web项目开发记录
查看>>
matlab函数:sprintf详解
查看>>
matlab函数:fix 向0取整
查看>>
ORCAD创建元件库时,格点对不起怎么办
查看>>
Allegro中如何消除器件本身Pin间距报错
查看>>
AD中拖动器件,无法移动在一起如何解决
查看>>