八皇后

对皇后问题给出一种解决方案. 算法是《算法分析与设计分析》教材上的. 要列举所有方案,还需自己改进!

package data_structure;

public class EightQueens {

	private static final int NumberOfQueen = 8; 
	private static int [] queens = new int[NumberOfQueen + 1];
	public static void main(String[] args) {
		getQueenLoaction();
		printQueens();
	}

	// 打印计算结果.
	private static void printQueens() {
		for (int i=1; i<queens.length; ++i) {
			System.out.print(queens[i] + " ");
		}
		System.out.println();
	}
	// 计算皇后的位置.
	private static void getQueenLoaction() {
		int k = 1;
		queens[1] = 0;
		while (k > 0) {
			queens[k] += 1;
			while ((queens[k] <= NumberOfQueen) && (!isQueenKOk(k)))
				queens[k] += 1;
			if (queens[k] <= NumberOfQueen) {
				if (k == NumberOfQueen) break;
				else {
					k += 1;
					queens[k] = 0;
				}
			}
			else {
				queens[k] = 0;
				k -= 1;
			}
		}
	}
	// 判断第 k 个皇后的位置(列标)是否 Ok.
	private static boolean isQueenKOk(int k) {
		for (int i=1; i<k; ++i) {
			// 如果发现 第 k 个皇后的列标与前面的第 i 个皇后的列表相同; 或者与第 i 个的斜率是 +1 或 -1, 那么返回false, 表示第 k 个元素的位置不Ok.
			// 否则, 第 k 个皇后的位置 Ok.
			if ((queens[i] == queens[k]) || (Math.abs(queens[i]-queens[k]) == Math.abs(i - k)))
				return false;
		}
		return true;
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值