美文网首页
八皇后问题

八皇后问题

作者: Cracks_Yi | 来源:发表于2017-07-28 20:06 被阅读0次

最近接触到八皇后问题,看了下其中一种思路还挺简单,就是全排列然后筛选出斜边也满足的排列方法。比较麻烦的是全排列,特别是用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。


相关文章

  • 11.数据结构—八皇后问题(回溯法)

    11.1 八皇后问题 八皇后问题是以国际象棋为背景的问题:有八个皇后(可以当成八个棋子),如何在 88 的棋盘中放...

  • 算法(03)回溯

    八皇后问题

  • 八皇后问题(N皇后问题)

    八皇后问题是一个经典的递归回溯问题。 描述 八皇后问题是在一个 8*8 的棋盘上放置皇后,要求其放置后满足同一行,...

  • 八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在...

  • 八皇后问题

    问题的类别是回溯(backtrace). 回溯通常用递归实现。回溯中注意边界问题,避免越界。同时,剪枝可以减少ca...

  • 八皇后问题

    课堂上老师讲了广度优先搜索算法后让课下实现下八皇后问题,就突发奇想了很多实现方法,这里只把我的实现方式和实现代码粘...

  • 八皇后问题

    问题 八皇后问题是一个古老而著名的问题,是试探法的典型例题。该问题由19世纪数学家高斯1850年手工解决。原题为在...

  • 八皇后问题

    采用试探回溯策略,通过栈记录查找结果,实现八皇后问题求解。 测试代码

  • 八皇后问题

    如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任两个皇后都不能处于同一条横行、纵行或斜线上。 先从第一列开...

  • 八皇后问题

    问题描述: 在8x8的网格上,放置皇后两个皇后,两个皇后之间不能在同一行,也不能在同一列,也不能在对角线上。 cl...

网友评论

      本文标题:八皇后问题

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