赞
踩
package com.lxf.demo03; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Queen { //最多皇后数 private static final int N=20; //存放各皇后所在的列号,即(i,q[i])为每一个皇后的位置 private static int[] q=new int[N]; //累计求解的个数 private static int count=0; public static void main(String[] args) throws IOException { int n; System.out.println(" 皇后问题(n<20)n="); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); n = Integer.valueOf(br.readLine()); //n值太大可能导致栈溢出 if(n>20){ System.out.println("n的值太大不能求解"); }else{ System.out.println("n皇后问题求解如下:"); queen(1, n); } } /** * 打印结果的函数 * @param n */ public static void dispasolution(int n){ System.out.println("第"+(++count)+"个解"); for (int i = 1; i <= n; i++) { System.out.println("("+i+","+q[i]+")"); } } /** * 判断当前位置是否能摆放皇后 * @param i * @param j * @return */ public static boolean place(int i,int j){ //第一个皇后总是可以放置 if(i==1) { return true; } int k=1; //跟之前放置的皇后一一比较,不能同列,且不在对角线上 while(k<i){ if((q[k]==j)||(Math.abs(q[k]-j)==Math.abs(i-k))){ return false; } k++; } return true; } public static void queen(int i,int n){ //当i>n大于n直接打印结果 if (i>n) { dispasolution(n); }else{ //根据第一个皇后放置不同的情况分别推算可能的结果 for (int j = 1; j <= n; j++) { if(place(i, j)){ q[i]=j; queen(i+1, n); } } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。