2n皇后问题

题目描述:


Y9J{PKX{Q~5KR)(KTSR22LO.png

解决方法:
递归+回溯
先铺上一层皇后,再铺一层

import java.util.*;
// 2n皇后自己写系列
public class Queen {
    static int count,n;
    static int[][] map;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        map = new int[n][n];  // 记得要将map实例化
        // 将输入数组值放入map
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                map[i][j] = sc.nextInt();
            }
        }
        // 假设放置白皇后的地方放2,放置黑皇后的地方放3
        put(0,2);
        System.out.println(count);
    }
    public static void put(int t,int s){
        if( t == n){ // 表示白皇后已经放完
            if(s == 2) put(0,3); // 此时开始放置黑皇后
            else count++;  // 如果黑皇后也已经放置完,count++
            return;
        }
        //  挨层放
        for( int i = 0; i < n; i++){ 
            if( map[t][i] != 1) continue; // 该位置不可放任何皇后 结束本次循环
            if(check(t,i,s)) map[t][i] = s; // 如果该位置可以放 那么放置皇后
            else continue;  // 该位置不可放置 结束本次循环
            put(t+1,s); // 该层放置成功,则开始放置下一层
            map[t][i] = 1;  // 回溯,如果下一层放置不成功,则回溯,如果两种皇后都放置成功,则测试下一种可能性
        }
        return;
    }
    public static boolean check(int t, int i,int s){
        for(int q = t-1; q >= 0; q--){    // 测试该列是否已经放置了皇后
            if(map[q][i] == s) return false;
        }
        for(int q = t-1,p = i-1; q >=0 && p >= 0;q--,p--){ // 测试左对角线是否已经放置了皇后
            if(map[q][p] == s) return false;
        }
        for(int q = t-1,p = i+1; q >= 0&& p < n;q--,p++){ // 测试右对角线是否已经放置了皇后
            if(map[q][p] == s) return false;
        }
        return true;
    }

}

你可能感兴趣的:(2n皇后问题)