package Search;
import static java.lang.System.out;
public class Queen {
public static int sum = 0;
public static void main(String args[])
{
getQueen(5);
}
public static void getQueen(int n)
{
int[] queen = new int[n+1];
int[] result = new int[n+1];
for(int i=1;i<=n;i++)
queen[i] = i;
System.out.println("输出结果如下:行->列");
trial(queen,result,1);
System.out.println("共 "+sum+" 个");
}
public static void trial(int[]queen,int[]result,int i) // i 表示行
{
if(i>queen.length-1)
{
sum++;
for(int s = 1;s<result.length;s++)
System.out.print(s+"->"+result[s]+",");
System.out.println();
}
else
{
for(int k=1;k<queen.length;k++)//K表示列,意思就是第I行看看应该放哪个列上,所以要查找所以的列
{
result[i] = k;//第 i 行为第K列,当行确定下来的时候,(i表示的行已经确定下来了),我们就查找它的所有可能的列值
if(isPut(result,i))//将i 作为参数,也就是将i,k两个值传了过去,因为K=result[i],也就是看看[i,a[i]]这个坐能不能放下
{ // 如果能放下的话,就直接放下一行,如果不能的话,就再换一个列
trial(queen,result,i+1);
}
}
}
}
public static boolean isPut(int a[],int k) {//查看第K行,第a[k]列是否适合放位置
for(int i=1;i<k;i++)// 因为K是要放的行,在这之前K行以的值都已经被放入,所以就和小于K的数比较
if(a[i]==a[k]||(Math.abs(i-k)==Math.abs(a[i]-a[k])))
return false;
return true;
}
}
/*
* 数据结构: a[i] i表示行,a[i] 表示列 ,因为只要求价值位置,也就是行列值,并不要求这个坐标内的值是多少,所以
* 用一维数组就可以搞定了
* 用回溯法得到一个求皇后问题的解空间树,然后利用深度优先搜索的方法查找这个解空间树,
* 在查找的过程中,为了加快效率,设置一个约束,就是查找同一行, or 同一列,or 同一斜线的点就不要向下查了,因为它们已经不满足了皇后问题
*
*
* 其实皇后问题就是一个填充矩阵的问题
* */
04-29