美文网首页
2n皇后问题

2n皇后问题

作者: beautymo | 来源:发表于2018-03-31 11:56 被阅读0次

    题目描述:


    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皇后问题

          本文链接:https://www.haomeiwen.com/subject/hndgcftx.html