28附加题 八皇后问题

来源:互联网 发布:小米6相机在那清除数据 编辑:程序博客网 时间:2024/05/11 23:38
<pre name="code" class="java">/*剑指offer上解决八皇后问题,没有用传统的递归或非递归回溯法,而是用了很巧妙的全排列法先说下八皇后问题:在8 X 8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处于同一行,同一列或者同意对角线上,求出所有符合条件的摆法。 全排列解决八皇后问题的思路如下:由于8个皇后不能处在同一行,那么肯定每个皇后占据一行,这样可以定义一个数组A[8],数组中第i个数字,即A[i]表示位于第i行的皇后的列号。先把数组A[8]分别用0-7初始化,接下来对该数组做全排列,由于我们用0-7这7个不同的数字初始化数组,因此任意两个皇后肯定也不同列,那么我们只需要判断每个排列对应的8个皇后中是否有任意两个在同一对角线上即可,即对于数组的两个下标i和j,如果i-j==A[i]-A[j]或i-j==A[j]-A[i],则认为有两个元素位于了同一个对角线上,则该排列不符合条件。*/

package question28;public class CubVertex {          static int count=0;public static void main(String[] args) {// TODO Auto-generated method stubint A[] = {0,1,2,3,4,5,6,7};      cubVertex(A,8,0);      System.out.println("总共有 "+count+" 个");}private static void cubVertex(int[] A, int len, int begin) {// TODO Auto-generated method stubif (A==null||len!=8) {return;}if (begin==len-1) {boolean can=true;for (int i = 0; i < len; i++) {for (int j = i+1; j < len; j++) {if (i-j==A[i]-A[j]||j-i==A[i]-A[j]) {can=false;break;}}}if (can) {for (int k : A) {System.out.print(k+" ");}count++;System.out.println();}}else {for (int i = begin; i < len; i++) {swap(A,begin,i);cubVertex(A, len, begin+1);swap(A, begin, i);}}}private static void swap(int[] A, int begin, int i) {// TODO Auto-generated method stubint temp=A[begin];A[begin]=A[i];A[i]=temp;}}


测试结果:


0 0
原创粉丝点击