经典例题--------------回溯法 8皇后问题(Java 描述)

八皇后问题

问题描述:

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 ≥ 1 或 n1 ≥ 4 时问题有解。
八皇后问题最早是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出。之后陆续有数学家对其进行研究,其中包括高斯和康托,并且将其推广为更一般的n皇后摆放问题。八皇后问题的第一个解是在1850年由弗朗兹·诺克给出的。诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。

解题代码:

public class sfz {
	public static int num=0;//方案总数
	public static int maxvalue=8;//放入几个皇后
	public static int cols [] =new int [maxvalue];//放入皇后的行号
	public static void getcount(int n) {
		boolean rows [] =new boolean [maxvalue];
		for (int i = 0; i < n; i++) {//寻找第n列的不可放入皇后的位置
			rows[cols[i]]=true;//同一行中不能放入,ps:不能放入皇后的位置为true
			int d=n-i;//找到一个列和当前列的差值
			if (cols[i]-d>=0) {//正斜角方向
				rows[cols[i]-d]=true;
			}
			if (cols[i]+d<=maxvalue-1) {//反斜角方向
				rows[cols[i]+d]=true;
			}
		}
		//上面的for循环结束,就会找到一个或者多个位置可以放入皇后
		for (int i = 0; i < maxvalue; i++) {
			if (rows[i]) {//为真 跳出循环
				continue;
			}
			cols[n]=i;//到这一步 说明就找到一个可以放入皇后的位置
			if (n

你可能感兴趣的:(成长之路)