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