N皇后问题

import java.util.Scanner;

public class Main {
	static int n;  //棋盘大小
	static int ans;  //解的个数
	static boolean[] a = new boolean[20];  // 列占用情况,若第 i 列被占用,则 a[i] = true,否则为 false
	static boolean[] x1 = new boolean[20];  // 左下-右上 对角线的占用情况
	static boolean[] y1 = new boolean[20];  // 左上-右下 对角线的占用情况
	
	private static void dfs(int deep) {  // deep 表示当前搜索到第几行
		if (deep >= n) {  // 搜索完最后一行,说明找到了一组合法解
	        ans++;
	        return;  // 回溯
	    }
	    for (int i = 0; i < n; i++) {  // 枚举当前行的皇后放置到第 i 列
	        if (x1[i + deep] == false && y1[i - deep + n] == false && a[i] == false) {  // 判断该皇后是否与已放置的皇后发生冲突
	            // 放置皇后 (deep, i),一共需要修改三个标记数组
	            x1[deep + i] = true;
	            y1[i - deep + n] = true;
	            a[i] = true;
	            dfs(deep + 1);  // 当前行枚举完毕,搜索下一行
	            // 恢复放置皇后 (deep, i) 前的状态
	            a[i] = false;
	            x1[deep + i]=false;
	            y1[i - deep + n] = false;
	        }
	    }
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		dfs(0);
		System.out.println(ans);
	}
}

  注:同一斜线上的(x1, y1), (x2, y2)满足条件:|x2 - x1| = |y2 - y1|,左下到右上这半部分满足同和规律,且和为1 - 6, 左上到右下满足同差规律, 且差加上n为1 - 7。(当n = 4时)

原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8404965.html