zoukankan      html  css  js  c++  java
  • [LeetCode]N-Queens 八皇后问题扩展(经典深层搜索)

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.


    Given an integer n, return all distinct solutions to the n-queens puzzle.

    Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.

    For example,
    There exist two distinct solutions to the 4-queens puzzle:

    [
     [".Q..",  // Solution 1
      "...Q",
      "Q...",
      "..Q."],
    
     ["..Q.",  // Solution 2
      "Q...",
      "...Q",
      ".Q.."]
    ]
    參考:LeetCode 题解
    戴方勤 (soulmachine@gmail.com)
    https://github.com/soulmachine/leetcode

    public class Solution {
    	boolean[] column = null;
    	boolean[] diag = null;
    	boolean[] anti_diag = null;
    	int[]C = null;
    	String model = null;
        public List<String[]> solveNQueens(int n) {
            column = new boolean[n];
            diag = new boolean[2*n];
            anti_diag = new boolean[2*n];
            C = new int[n];//Q在第i行的第几列
            List<String []> res = new ArrayList<>();
    
            dfs(0,res,n);
            return res;
            
        }
        
        private void dfs(int row,List<String[]> res,int n){
        	if(row==n){
        		String [] str = new String[n];
        		for(int i=0;i<n;i++){
        			StringBuilder sb = new StringBuilder();
        			for(int j=0;j<n;j++){
        				if(C[i]==j){
        					sb.append("Q");
        				}else{
        					sb.append(".");
        				}
        			}
        			str[i] = sb.toString();
        		}
        		res.add(str);
        		return;
        	}
        	
        	for(int j=0;j<n;j++){
        		if(!column[j]&&!anti_diag[row+j]&&!diag[n-row-1+j]){
        			C[row]=j;
        		}else{
        			continue;
        		}
        		column[j]=anti_diag[row+j]=diag[n-row-1+j]=true;
        		dfs(row+1,res,n);
        		column[j]=anti_diag[row+j]=diag[n-row-1+j]=false;
        	}
        }
    }





    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    SCXML和QScxml使用总结
    qt 使用qtxlsx 读写excel
    Qt Qml嵌入Widget以及Qml与Widget交互
    三步带你开发一个短链接生成平台
    SessionStorage、LocalStorage详解
    低代码如何支撑企业级应用开发?
    开发一个渐进式Web应用程序(PWA)前都需要了解什么?
    详细了解JS Map,它和传统对象有什么区别?
    5种可能在10年后消失的开发语言
    更改tomcat启动的端口号
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4713737.html
Copyright © 2011-2022 走看看