递归回溯解决八皇后

it2022-05-05  138

package com.ykh.huisu; /*递归回溯解决八皇后问题 * */ public class Queen8 { int[] array=new int[8];//用数组表示每个皇后的位置 int count=0;//记录排列的方法的总数 //判断第n个皇后和前面n-1个皇后是否在同一列或者同一斜线上 public boolean isOk(int n) { for(int i=0;i<n;i++) { if(array[i]==array[n]||Math.abs(array[n]-array[i])==Math.abs(n-i)) { return false; } } return true; } //摆放皇后的方法,将会用到递归回溯 /*基本方法是: * 1)先将第一个皇后放在第一行第一列 array[0]=0; * 2)在将第二个皇后放在第二行,从第二行第一列开始,逐渐向右移,直到皇后不冲突 * 3)以后的每一个皇后都按照这样的方法在每一行进行摆放 * 4)若找不到一个位置能满足条件,就回溯,上一个皇后的位置就应该发生改变 * 5)只要找到了一个满足条件的解,也要回溯,上一个皇后的位置发生改变,然后找下一个位置, * */ public void putQueen(int n) { if(n==8) {//n=8时所有的皇后都摆好了,这个时候只需要将数组打印出来就可以了 print(); count++; return; } for(int i=0;i<8;i++) { array[n]=i; if(isOk(n)) { putQueen(n+1); } } } //打印皇后位置的数组 public void print() { int len=array.length; for(int i=0;i<len;i++) { System.out.print(array[i]+""); } System.out.println(); } public static void main(String[] args) { Queen8 test=new Queen8(); test.putQueen(0); System.out.println(test.count); }

最新回复(0)