八皇后(N皇后)问题

N皇后代码简化至33行
八皇后问题:一个古老而著名的问题,是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有 76 种方案。1854 年在柏林的象棋杂志上不同的作者发表了 40 种不同的解,后来有人用图论的方法解出 92 种结果。计算机发明后,有多种计算机语言可以编程解决此问题。

源代码:

import java.util.Arrays;
public class N_Queen {
	static int N = 8, count = 0;
	static int arr[][] = new int[N][N];
	public static void main(String args[]) {
		find(0);
	}
	static void find(int i) {
		if (i == N) {
			System.out.println(++count+":");
			for (int k = 0; k < N; k++)
				System.out.println(Arrays.toString(arr[k]));
		}
		for (int j = 0; j < N; j++)
			if (check(i, j)) {
				arr[i][j] = 1;
				find(i + 1);
				arr[i][j] = 0;
			}
	}
	static boolean check(int i, int j) {
		for (int x = 0; x < N; x++)
			if (arr[x][j] == 1)
				return false;
		for (int x = i - 1, y = j - 1; x >= 0 && y >= 0; x--, y--)
			if (arr[x][y] == 1)
				return false;
		for (int x = i - 1, y = j + 1; x >= 0 && y < N; x--, y++)
			if (arr[x][y] == 1)
				return false;
		return true;
	}
}

运行结果:
在这里插入图片描述

发布了53 篇原创文章 · 获赞 1 · 访问量 2778

猜你喜欢

转载自blog.csdn.net/weixin_43873198/article/details/105535839