递归--8皇后问题

    技术2024-10-27  22

    8皇后问题: 8*8的国际象棋中,摆8个皇后,任意两个皇后之间都不会处于同一行,同一列或者是同一斜线上,问有多少中摆法? 思路:

    第一个换后先放在第一行第一列第二个皇后放在第二行的第一列开始,判断是否可行,如果不可行,则继续放在第二列,第三列。。。直到找到合适的位置继续放置第三个皇后,如同步骤2当得到一个正确解的时候,递归中的栈退回到上一个栈时,就会开始回溯,即将第一个皇后放在第一列的所有正确解得到然后回头继续将第一个皇后放在第二列,。。。后面陆续执行2345678列

    代码

    public class Queue { int maxSize=8;//皇后的数量 int[] array=new int[maxSize];//array[i]表示第i行第array[i]列 static int count=0;//多少种解法 public static void main(String[]args) { Queue queue=new Queue(); queue.check(0);//从0开始放 System.out.println("共有"+count+"种结果"); } private void check(int n) { if(n==maxSize) { //表示已经到放置第九个(0-8) printf(); count++; return; } for(int i=0;i<maxSize;i++) { array[n] = i;//先把当前这个皇后 n , 放到该行的第1列,array[n]==i表示从第1列开始,i初始值为0 //判断当放置第n个皇后到第i列的时候,会不会冲突 if(judge(n)) { //如果不冲突,就放置下一个皇后 check(n+1); } //如果冲突,i++ } } //判断皇后的位置是否可以放置 /** * * @param n表示第n个皇后 * @return */ private boolean judge(int n) { for(int i=0;i<n;i++) { //(array[i]==array[n]表示两个皇后在同一列 array[i]表示第array[i]列 //Math.abs(i-n)==(Math.abs(array[i]-array[n]))表示两个皇后在同一斜线上 if(array[i]==array[n]||Math.abs(n-i)==(Math.abs(array[n]-array[i]))) { return false; } } return true; } //输出结果方法 private void printf() { for(int i=0;i<array.length ;i++) { System.out.printf(array[i]+" "); } System.out.println(); } }
    Processed: 0.010, SQL: 9