8皇后問題

由於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();
    }

}

這是八皇后所有解的可能
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章