n 皇后

来源:互联网 发布:java经典编程300例.pdf 编辑:程序博客网 时间:2024/04/28 09:58
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 同一斜线的点就不要向下查了,因为它们已经不满足了皇后问题 *  *  * 其实皇后问题就是一个填充矩阵的问题 * */