ブルーブリッジカップ2nクイーンズの質問

方法1

public class Queen {
	static int n=8,count;
	public static void main(String[] args){
		int[][] mainChess=new int[n][n];
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
			mainChess[i][j]=0;	
			}
			
		}
		putChess(0,mainChess);
	}
	private static void putChess(int row, int[][] chess) {
		int[][] currentChess=(int[][])chess.clone();
		if(row==n)
		{
			count++;
			System.out.println("第"+count+"中:");
			for(int i=0;i<n;i++)
			{
				for(int j=0;j<n;j++)
				{
					System.out.println(currentChess[i][j]);
					
				}
				System.out.println();
			}
			System.out.println();
			return;
		}else{
			for(int i=0;i<n;i++){
				if(!isDanger(row,i,currentChess)){
					for(int j=0;j<n;j++){
						currentChess[row][j]=0;
					}
					currentChess[row][i]=1;
					putChess(row+1,currentChess);
				}
			}
		}
	}
	private static boolean isDanger(int row, int col, int[][] currentChess) {
		for(int i=0;i<row;i++){
			if(currentChess[i][col]==1) return true;
			for(int j=0;j<n;j++){
				if((row+col)==(i+j)||(row-col)==(i-j)&&currentChess[i][j]==1) return true;
			}
		}
		return false;
	}
}

方法2(わかりにくい)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Nqueen2 {
	    static List<List<String>> lists = new ArrayList<>();//返回集合
	    static List<String> ans = new ArrayList<>();//n皇后的解
	    public static List<List<String>> solveNQueens(int n) {
	        Map<Integer,String> param = new HashMap<>();
	        for(int i = 0; i < n; i++){//......
	            StringBuilder sb = new StringBuilder();
	            for(int j = 0; j < n;j++) {
	                if(j == i)sb.append("Q");
	                else sb.append(".");
	            }
	            param.put(i,sb.toString());
	        }
	        //列的大小为n,主对角线和次对角线的大小为2n-1
	        queens(n, new boolean[n], new boolean[2 * n - 1], new boolean[2 * n - 1], param,0);
	        return lists;
	    }
	    static void queens(int n,boolean[] y,boolean[] w,boolean[] wc, Map<Integer,String> param,int i){
	        if(ans.size() == n){//递归结束条件,即n皇后已放置所有的行中
	            lists.add(new ArrayList<>(ans));
	            return;
	        }
	            for(int j = 0; j < n; j++){
	                //判断当前位置是否可用,即列、主对角线、次对角线是否被使用
	                if(y[j] || w[n - 1 - i + j] || wc[i + j]) continue;
	                //如果可用,先标记该列、主对角线、次对角线已被使用
	                y[j] = true;
	                w[n - 1 - i + j] = true;
	                wc[i + j] = true;
	                ans.add(param.get(j));
	                //递归下一行是否可以放置皇后,直到所有皇后都放到对应的位置或者该行无法放置皇后则结束
	                queens(n,y,w,wc,param,i+1);
	                //递归完成之后,恢复现场
	                ans.remove(i);
	                y[j] = false;
	                wc[i + j] = false;
	                w[n - 1 - i + j] = false;
	            }
	    }
	    public static void main(String[] args) {
	    	System.out.println(solveNQueens(4));
		}
}
元の記事を44件公開 Likes2 訪問数540

おすすめ

転載: blog.csdn.net/qq_43699776/article/details/103283196