由於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();
}
}
這是八皇后所有解的可能