N 皇后问题 : Leetcode 51. N-Queens

参考博客:  

回溯法 之 八皇后问题




N 皇后问题  : Leetcode 51. N-Queens


迭代写法:

import java.util.ArrayList;
import java.util.List;

public class Solution{
	public static void main(String[] args){
		int num = 0;
		Solution s = new Solution();
		s.solveNQueens(4);
	}
	
	public List<List<String>> solveNQueens(int n) {
		int[] queen = new int[n];
    	for(int i=0;i<n;i++){
    		queen[i]=-1;
    	}
    	List<List<String>> res = new ArrayList<List<String>>();
    	int i = 0;
    	while(i>=0){
    		while(queen[i]<n-1){
    			queen[i] ++;  // queen at (i,queen[i])  找下一列
    			if(i==n-1&&isValid(queen,i,queen[i])){
    				List<String> elem = new ArrayList<String>();
    				for(int j=0;j<=n-1;j++){
    					int val = queen[j];
    					String s = "";
    					for(int h=0;h<=n-1;h++){
    						if(h!=val){
    							s += ".";
    						}else{
    							s += "Q";
    						}
    					}
    					elem.add(s);
    				}
    				res.add(elem);
    			}else if(isValid(queen,i,queen[i])){
    				i++;
    			}
    		}
    		//fail back
    		queen[i] = -1;
    		i--;
    	}
    	return res;
	}

	private boolean isValid(int[] queen, int k, int i) {
		// TODO Auto-generated method stub
		for(int j=0;j<k;j++){
			if(queen[j]!=-1&&(i==queen[j]||k+i==j+queen[j]||k+queen[j]==i+j)){
				return false;
			}
		}
		return true;
	}
}



递归解法:

import java.util.ArrayList;
import java.util.List;

public class Solution{
	public static void main(String[] args){
		int num = 0;
		Solution s = new Solution();
	}
	public int num;
	
	
	public List<List<String>> solveNQueens(int n) {
		int[] queen = new int[n];
    	for(int i=0;i<n;i++){
    		queen[i]=-1;
    	}
    	List<List<String>> res = new ArrayList<List<String>>();
    	getQueenPuzzle(n,queen,0,res);
    	return res;
	}
	

	private void getQueenPuzzle(int n, int[] queen, int k,List<List<String>> res) {
		// TODO Auto-generated method stub
		for(int i=0;i<=n-1;i++){
			queen[k]=i; // queen at (k,i)
			if(k==n-1&&isValid(queen,k,i)){
				List<String> elem = new ArrayList<String>();
				for(int j=0;j<=n-1;j++){
					int val = queen[j];
					String s = "";
					for(int h=0;h<=n-1;h++){
						if(h!=val){
							s += ".";
						}else{
							s += "Q";
						}
					}
					elem.add(s);
				}
				res.add(elem);
			}else if(isValid(queen,k,i)){
				getQueenPuzzle(n,queen,k+1,res);
			}
			// not valid for i, then i++;
		}
	}

	private boolean isValid(int[] queen, int k, int i) {
		// TODO Auto-generated method stub
		for(int j=0;j<k;j++){
			if(queen[j]!=-1&&(i==queen[j]||k+i==j+queen[j]||k+queen[j]==i+j)){
				return false;
			}
		}
		return true;
	}
}

52. N-Queens II


迭代写法:

import java.util.ArrayList;
import java.util.List;

public class Solution{
	public static void main(String[] args){
		int num = 0;
		Solution s = new Solution();
		s.solveNQueens(9);
	}
	
	public int num;

	public int totalNQueens(int n) { 
		num = 0;
		int[] queen = new int[n];
    	for(int i=0;i<n;i++){
    		queen[i]=-1;
    	}
    	List<List<String>> res = new ArrayList<List<String>>();
    	int i = 0;
    	while(i>=0){
    		while(queen[i]<n-1){
    			queen[i] ++;  // queen at (i,queen[i])  找下一列
    			if(i==n-1&&isValid(queen,i,queen[i])){
    				num++;
    			}else if(isValid(queen,i,queen[i])){
    				i++;
    			}
    		}
    		//fail back
    		queen[i] = -1;
    		i--;
    	}
		return num;		
	}
	
	
	public List<List<String>> solveNQueens(int n) {
		int[] queen = new int[n];
    	for(int i=0;i<n;i++){
    		queen[i]=-1;
    	}
    	List<List<String>> res = new ArrayList<List<String>>();
    	int i = 0;
    	while(i>=0){
    		while(queen[i]<n-1){
    			queen[i] ++;  // queen at (i,queen[i])  找下一列
    			if(i==n-1&&isValid(queen,i,queen[i])){
    				List<String> elem = new ArrayList<String>();
    				for(int j=0;j<=n-1;j++){
    					int val = queen[j];
    					String s = "";
    					for(int h=0;h<=n-1;h++){
    						if(h!=val){
    							s += ".";
    						}else{
    							s += "Q";
    						}
    					}
    					elem.add(s);
    				}
    				res.add(elem);
    			}else if(isValid(queen,i,queen[i])){
    				i++;
    			}
    		}
    		//fail back
    		queen[i] = -1;
    		i--;
    	}
    	return res;
	}

	private boolean isValid(int[] queen, int k, int i) {
		// TODO Auto-generated method stub
		for(int j=0;j<k;j++){
			if(queen[j]!=-1&&(i==queen[j]||k+i==j+queen[j]||k+queen[j]==i+j)){
				return false;
			}
		}
		return true;
	}
}



递归解法:

import java.util.List;

public class Solution{
	public static void main(String[] args){
		int num = 0;
		Solution s = new Solution();
	}
	public int num;
	
	public int totalNQueens(int n) {
		num = 0;
    	int[] queen = new int[n];
    	for(int i=0;i<n;i++){
    		queen[i]=-1;
    	}
    	getQueenPuzzle(n,queen,0);
		return num;
    }
	

	private void getQueenPuzzle(int n, int[] queen, int k) {
		// TODO Auto-generated method stub
		for(int i=0;i<=n-1;i++){
			queen[k]=i; // queen at (k,i)
			if(k==n-1&&isValid(queen,k,i)){
				num++;
			}else if(isValid(queen,k,i)){
				getQueenPuzzle(n,queen,k+1);
			}
			// not valid for i, then i++;
		}
	}

	private boolean isValid(int[] queen, int k, int i) {
		// TODO Auto-generated method stub
		for(int j=0;j<k;j++){
			if(queen[j]!=-1&&(i==queen[j]||k+i==j+queen[j]||k+queen[j]==i+j)){
				return false;
			}
		}
		return true;
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值