8皇后问题

来源:互联网 发布:lcd1602只亮不显示数据 编辑:程序博客网 时间:2024/06/07 02:21

由于8皇后不能在同一行或者同一列也不能在同一对角线,所以我们只要控制排除错误的情况进行递归即可。既首先。开个答案数组为n行的。然后我们开始按先行后列放置,第一行里,从第一列放到最后列,看有没有冲突,全部有冲突就回到上一行。就是个简单的DNF。
我这里的代码修改下就可以当作N皇后求解了 。

import java.util.ArrayList;import java.util.List;public class EightQueen {    int maxRow,maxCol,maxSize=8;    int[] result=new int[maxSize];    List<int[]> list=new ArrayList<int[]>();    EightQueen()    {        maxRow=maxSize;        maxCol=maxSize;        for(int i=0;i<maxRow;i++)        {            result[i]=-1;        }        solveQueue(0);        for(int j=0;j<list.size();j++)        {            System.out.println("答案"+(j+1));            for(int i=0;i<list.get(j).length;i++)            {                System.out.print((list.get(j)[i]+1)+" ");            }            System.out.println();        }    }    boolean solveQueue(int row)    {        if(row>=maxRow)        {            int[] temp=new int[result.length];            for(int i=0;i<result.length;i++)            {                temp[i]=result[i];            }            list.add(temp);            return false;        }        for(int i=0;i<maxCol;i++)        {            if(checkSafe(row,i))            {                result[row]=i;                if(solveQueue(row+1))                {                    return true;                }else                {                    result[row]=-1;                }            }        }        return false;    }    boolean checkSafe(int row,int col)    {        //行冲突        if(result[row]!=-1)        {            return false;        }        for(int i=0;i<row;i++)        {            //列冲突            if(result[i]==col)            {                return false;            }            //对角线冲突            if(Math.abs(i-row)==Math.abs(result[i]-col))            {                return false;            }        }        return true;    }    public static void main(String[] args)     {        EightQueen test=new EightQueen();    }}

这是八皇后所有解的可能
这里写图片描述

0 0
原创粉丝点击