欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java回溯法解n皇后问题

程序员文章站 2022-07-10 09:17:47
话不多说上代码;import java.util.Scanner;class GC2{ static int num;//皇后的数目 static int [] feasible;//记录第i列是否存在皇后,因为从第1行开始到最后一行,所以不用记录行数 static int count=0; public static void placequeen(int n) {//在第n行摆放皇后 if(n>num) {//当搜索完最后一行后,输出棋盘情况 count++; S...

话不多说上代码;

import java.util.Scanner;
class GC2{
 static int num;//皇后的数目
 static int [] feasible;//记录第i列是否存在皇后,因为从第1行开始到最后一行,所以不用记录行数
 static int count=0;
 public static void placequeen(int n) {//在第n行摆放皇后
  
  if(n>num) {//当搜索完最后一行后,输出棋盘情况
   count++;
   System.out.println("第"+count+"种情况:");
   for(int i =1 ;i<n;i++) {
    for (int j=1;j<feasible[i];j++) {
    System.out.print(0+" ");}
    System.out.print(1+" ");
    for (int k=feasible[i]+1;k<=num;k++) {
     System.out.print(0+" ");
    }
    System.out.println();
    if(i==n-1) {
     System.out.println();
    }
    }
   return;
  }
  for (int i=1;i<=num;i++) {//i从1列开始,避免弄乱
   if(isConflict(n,i)) {
    continue;
   }
   else {
    feasible[n]=i;
    placequeen(n+1);
   }
  }
  /*
 * 
 * 判断能否在(x,y)放一个皇后的方法
 * x表示行号
 * y表示列号
 * 
 * 
 */
 //下面这个方法可以写的更加简便一些,待我吃完饭再写
    private static boolean isConflict(int row, int column) {  //第n个皇后也代表着第n行
        if(row == 1){//第1行永远不会冲突  
            return false;  
        }  
        for (int i = 1; i < row; i++) {  //当前的行数
            if (feasible[i] == column || ( column - row) == (feasible[i] - i) || (row - column)== (i-feasible[i])   //以前行数减列数与现在的是否相等
                || (row + column) == (feasible[i] + i)) {  
                return true;  
            }  
        }  
        return false;  
    }
  }
  public static void main(String[] args) {
 Scanner sc=new Scanner(System.in);
 num = sc.nextInt();//输入棋盘的行或列(棋盘行=列)
 feasible=new int[num+1];
 for (int i = 0; i < feasible.length; feasible[i++] = -1);//初始化棋盘  
 placequeen(1);
 
    
}
}

本文地址:https://blog.csdn.net/qq_52465706/article/details/110265218

相关标签: java 算法