N皇后问题

N皇后问题

N皇后问题就是在一张N*N棋盘上,放置N个皇后,他们之间不能横、竖、对角线存在

使用回溯法实现

package com.example.data;

import com.sun.deploy.security.SelectableSecurityManager;

/**
 * *@ClassName Nqueens
 * *@Author yyc
 * *@Date 2020/6/15 17:31
 * N皇后问题
 **/
public class Nqueens {

    public int[] result=null;

    public void calQueens(int size)
    {
        result= new int[size];
        int[] board=new int[size];
        queens(board,0,size);
    }


    public boolean queens(int[] board,int current,int size)
    {
        if(current==size)
            return true;
        else
        {
            for(int i=0;i<size;i++)
            {
                board[current]=i;
                if(noConflitboard(board,current))
                {
                    boolean done=queens(board,current+1,size);
                    if(done) {
                        result[i]=current;
                        return true;
                    }
                }
            }

            return false;
        }
    }

    public boolean noConflitboard(int[] board,int current)
    {
       for(int i=0;i<current;i++)
       {
           if(board[i]==board[current])
               return false;
           if(current-i==Math.abs(board[current]-board[i]))
               return false;
       }

       return true;
    }
}

其主要思想就是把棋盘设置成一个数组,index为当前棋盘的列,数组[index]为当前行的值。通过反复比较当前行与未来设置的行之间的关系是否满足棋盘要求来进行位置判定。

还有最主要的一个:这里通过判断值相同,说明在同一行,Index之差与行之差的ABS值相同,说明是在对角线上。

演示

N皇后问题_第1张图片

你可能感兴趣的:(算法)