package dfs;
public class NQueens {
private int n=0;
//参数n为几个皇后的数目
private int x[]=new int [8];
//解向量也就是解空间树,存放皇后的列数,注意这里的x[i]中的i表示这个皇后在第i行,x[i]的值表示的是这个皇后在这一行的第几列
private int sum=0;//统计解空间的数量
public boolean Place (int k)//判断皇后是不是在同一行或是同一列,或是同一对角线
{
for(int j=0;j<k;j++)
if((Math.abs(k-j)==Math.abs(x[j]-x[k]))||(x[j]==x[k]))
//这里是二个皇后的行号差与列号差的绝对值相等的话,列号相等就代表在同一对角线上
return false;
return true;
}
public void Backtrack(int t)//这里是递归调用这个函数,其实这里相当于就是回溯发的体现和裁剪的意识
{
if(t>=n)//t的數量大於n這個的話就代表問題解決
{
sum++;
System.out.println("----------结果为:----------");
for(int i=0;i<n;i++)//循環輸出解向量
{
System.out.println("-------------"+x[i]+"-------------");
}
}
else{
for(int i=0;i<n;i++)
{
x[t]=i;
if(this.Place(t))Backtrack(t+1);
}
}
}
public static void main(String args[])
{
NQueens demo=new NQueens();
demo.n=8;//初始化皇后的數目
demo.sum=0;//初始化皇后的解空間的數量為0
for(int i=0;i<demo.n;i++)
{
demo.x[i]=1000;//循環初始化解向量空間的數值
}
demo.Backtrack(0);
}
}
N皇后
最新推荐文章于 2024-04-18 08:15:00 发布