• n-Queens(n皇后)问题的简单回溯


    package com.main;
    
    import java.util.LinkedList;
    
    public class NoQueue {
    
        public LinkedList<Node> getQueue(int n){
            LinkedList<Node> queues = new LinkedList<Node>();
            int m=0;
            boolean p = true;  // 是否需要向上回溯
            while(m < n){
                if(m == 0){
                    Node q= new Node(0,0);
                    queues.add(q);
                    m++;
                }
                if(n >0){
                    Node q = queues.getLast();
                    if(p){
                        p=false; // 默认没找到
                        for(int i=0;i<n;i++){
                            Node q1 = new Node(q.x+1,i);
                            // 比较
                            if(checkQueue(q1,queues)){  // 找到结果,向下一步追踪
                                queues.add(q1);
                                m++;
                                p=true;
                                break;
                            }
                        }
                    }else{ // 没有找到结果向上回溯
                        q =queues.removeLast();  // 把最后一个取出来
                        for(int i=q.y+1;i<n;i++){
                            Node q1= new Node(q.x,i);
                            if(checkQueue(q1,queues)){  // 找到结果,向下一步追踪
                                queues.addLast(q1);
                                p=true;
                                break;
                            }
                        }
                        if(!p){
                            m--;
                        }
                    }
                }
                
            }
            return queues;
        }
        public boolean checkQueue(Node q1,LinkedList<Node> queues){
            boolean b = true;
            if(queues.size() == 0){
                return b;
            }
            for(int i=0;i<queues.size();i++){
                Node q = queues.get(i);
                if(q1.x==q.x || q1.y==q.y || q1.x-q.x == q1.y-q.y || q1.x-q.x == -1*(q1.y-q.y)){
                    b=false;
                    break;
                }
            }
            return b;
        }
        public static void main(String[] args) {
            NoQueue noq = new NoQueue();
            int n= 4;
            LinkedList<Node> l = noq.getQueue(n);
            for(int j=0;j<n;j++){
                for(int i=0;i<n;i++){
                Node node= l.get(i);
                    if(j == node.y){
                        System.out.print(" Q");
                    }else{
                        System.out.print(" 1");
                    }
                }
                System.out.println();
            }
        }
        class Node {
            int x;
            int y;
            public Node(int i,int j){
                this.x=i;
                this.y=j;
            }
            @Override
            public String toString() {
                // TODO Auto-generated method stub
                return x+","+y;
            }
        }
    }
  • 相关阅读:
    友元类和友元函数
    C++中构造函数和析构函数调用的时机
    Linux 下svn恢复到某一版本
    lua 中pairs 和 ipairs区别
    孤儿进程与僵尸进程
    union
    关于C++ const 的全面总结
    后台管理左侧菜单
    全选-反选-取消
    Dom-直接 /间接选择器
  • 原文地址:https://www.cnblogs.com/qinshuipo/p/11454393.html
Copyright © 2020-2023  润新知