每日一题:n queues

题目:在n阶棋盘上放n个皇后,皇后在横竖斜都不能重复。
分析:这是一道典型的回溯算法
算法:
1>如果当前的格子是可以放皇后执行2>不能放执行3>
2>往下一行找。
3>往下一列去找,如果这一行都没有,那么回溯到上一行找上一行的放皇后的下一列。

    
        public static List<List<String>> solveNQueens(int n) {
    
            int[] a = new int[n];
            for (int i = 0; i < n; i++) {
                a[i] = -1000;
            }
            int i = 0;
            int j = 0;
            List<List<String>> res = new ArrayList<>();
            while (i < n) {
                while (j < n) {
                    if (valid(a, i, j)) {
                        a[i] = j;
                        // 每次下一个都从第0列开始搜索。
                        j = 0;
                        break;
                    } else {
                        j++;
                    }
                }
    
                if (a[i] == -1000) {
                    if (i == 0) {
                        break;
                    } else {
                        --i;
                        j = a[i] + 1;
                        a[i] = -1000;
                        continue;
                    }
    
                }
                if (i == n - 1) {
                    res.add(transfer(a));
                    j = a[i] + 1;
                    a[i] = -1000;
                    continue;
                }
                ++i;
    
            }
            return res;
        }
    
        private static boolean valid(int[] a, int i, int j) {
        
            for (int k = 0; k < a.length; k++) {
                if (a[k] == j || Math.abs(a[k] - j) == Math.abs(k - i)) {
                    return false;
                }
            }
            return true;
        }
    
        private static List<String> transfer(int[] a) {
            int len = a.length;
            List<String> res = new ArrayList<>(len);
            StringBuffer sb = new StringBuffer(len);
            String mod = "";
            for (int i = 0; i < len - 1; i++) {
                sb.append('.');
            }
            mod = sb.toString();
            for (int i = 0; i < len; i++) {
                res.add(sb.insert(a[i], 'Q').toString());
                sb.setLength(0);
                sb.append(mod);
            }
            return res;
        }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 14,695评论 0 89
  • N皇后问题 以八皇后为例,在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,皇后可以在其所在位置的对应的行,列...
    Yihulee阅读 7,124评论 0 2
  • 问题描述 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(不同行,不同列,不同对角线)。给定...
    Alfie20阅读 3,733评论 0 0
  • N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一...
    HUNYX阅读 6,906评论 0 0
  • 与其悔恨过去的无所作为,不如珍惜当下点点滴滴的付出和努力。
    艾涤生微习惯3650天阅读 1,891评论 0 2

友情链接更多精彩内容