• 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时)

  • 相关阅读:
    Html.ActionLink 几种重载方式说明及例子
    2 python 文本特征提取 CountVectorizer, TfidfVectorizer
    模型调参---GridSearchCV
    1 NLP学习大纲
    pandas.dropna/isnull/fillna/astype的用法
    激活函数总结
    LeetCode--53 最大连续子序列(总结)
    LeetCode--44 通配符匹配
    LeetCode--Two_Sum
    css 背景图片自适应元素大小
  • 原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8404965.html
Copyright © 2020-2023  润新知