八皇后问题

最近接触到八皇后问题,看了下其中一种思路还挺简单,就是全排列然后筛选出斜边也满足的排列方法。比较麻烦的是全排列,特别是用List来存储结果。本来想新建一个List用=来复制原List,发现这样做对新List操作仍会影响原List,所以还是得新建空List再一个个元素添加。

本问题可拓展到N皇后。

全排列解法

public class Test1 {
    public List<List<String>> solveNQueens(int n) {
        
        
        List<Integer> l = new ArrayList<Integer>();
        for(int i = 0; i < n; i++){
            l.add(i);
        }
        
        List<List<Integer>> list = permutation(l,0);
      
        List<List<Integer>> filter = new ArrayList();
        for(int i = 0; i < list.size();i++){
            List<Integer> temp = list.get(i);
            if(valid(temp))filter.add(temp);
        }
    
        List<List<String>> res = new ArrayList<List<String>>();
        for(List<Integer> elem : filter){
            List<String> strList = new ArrayList<String>();
            for(int i = 0; i < elem.size(); i++){
                strList.add(generateStr(elem.size(),elem.get(i)));
            }
            res.add(strList);
        }
        
        return res;
     
    }
    
    public boolean valid(List<Integer> l){
        for(int i = 0; i <l.size() - 1; i++){
            for(int j = i + 1; j < l.size();j++){
                if(l.get(i) - l.get(j) == i - j || l.get(i) - l.get(j) == j - i){
                    return false;
                }
            }
        }
        return true;
    }


    public String generateStr(int n, int index){
        char[] str = new char[n];
        for(int i = 0; i < n; i++){
            str[i] = index == i ? 'Q':'.';
            }
            return new String(str);
    }
        
      
     public List<List<Integer>> combine(int first, List<List<Integer>> list){
            
        List<List<Integer>> res = new ArrayList();

        for(int i = 0; i < list.size(); i++){
            List<Integer> temp = new ArrayList(Arrays.asList(first));
            temp.addAll(list.get(i));
            res.add(temp);
        }

        return res;
    }
            
        
    public void swap(List<Integer> l, int i, int j){
        int temp = l.get(i);
        l.set(i,l.get(j));
        l.set(j,temp);
    }
 
    
    public List<List<Integer>> permutation(List<Integer> l, int from) {
        
        List<List<Integer>> res = new ArrayList();

        if(l.size() == from) return res;
        if(l.size() == from + 1){
            res.add(new ArrayList(Arrays.asList(l.get(from))));
            return res;
        }
        
        for(int i = from; i < l.size(); i++){
            swap(l,from,i);
            res.addAll(combine(l.get(from),permutation(l, from + 1)));
            swap(l,from,i);
        }
        
        return res;
    } 
}

这个时间复杂度比较高,在leetcode测试时N=9就会time limit exceeded。



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 八皇后问题问题描述:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔...
    药药耀耀阅读 2,171评论 0 0
  • 八皇后问题:在8*8的棋盘上放置8个皇后,保证任意两个皇后之间不能相互攻击。(即没有两个皇后是在同一行、同一类、或...
    五秋木阅读 848评论 0 0
  • 问题描述 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8...
    指尖极光阅读 1,071评论 0 0
  • 很多次,我都有种模糊的感觉。不知我突然想到的事或者刚刚经历的事到底是不是我经历过又或者是梦境。 我总是把梦境和现实...
    凡有所像皆是虚妄阅读 811评论 0 0
  • 简介 这本书的内容比较独特,讲的是一个重病在身临终的老教授,给他曾经的一个学生上的最后“一门课”,这门课不属于具体...
    陌辞寒阅读 7,606评论 0 3

友情链接更多精彩内容