求解N皇后问题的回溯法java实现

N皇后问题要求求解N*N的棋盘上放置N个皇后,并使各皇后彼此不受攻击的所有可能的棋盘布局

皇后彼此不受攻击的约束条件是:任何两个皇后均不能在同一行,同一列,或者同一对角线

思路:采用一维数组X表示N皇后的解,X【i】的值表示第i行皇后所在的列号

采用一维数组本身的数据结构就很好解决了任何两个皇后不会出现在同一行中,因此,只需考虑任意两个皇后不能在同一列,和对角元素即可

不出现在同一列的条件:X[i]!=x[s]

row行 与 s行不出现在对角线的条件:|row-s| = |x[row] - x[s]|

采用StringBuffer 进行数据的存储,保存每一个结果:

代码实现:

import java.util.Scanner;

public class Tria {
    private static StringBuffer buffer = new StringBuffer();
    private static int test =0;
    
 public Tria() {
    
     
}
public static boolean isRightPlace(int[] x, int row) {
    //比较该行与在此之上的每一行位置比较
    for(int i = 0;i<row;i++) {
        if(x[i]==x[row]||Math.abs(row-i)==Math.abs(x[row]-x[i])) {
        return false; 
        }        
    }
    return true;
}

//在每一行上放置皇后
public static StringBuffer setQueen(int[] x,int i,int n) {    
    
    if(i==n) {
        
    for(int k =0;k<n;k++) {
        
        buffer.append(x[k]);
        
    }
    test++;
    buffer.append(" ");
    
    
   
    }else {
        for(int j=0;j<n;j++) {
            x[i] = j;
            if(isRightPlace(x, i)) {
                System.out.println("第"+i+"的初始放置元素为"+j);
                setQueen(x, i+1, n);
                
            }
        }
        }
    return buffer;

}

public static void main(String[] args) {
    int count;
    System.out.println("请输入棋盘数据");
    Scanner scanner = new Scanner(System.in);      
     count = scanner.nextInt();
     scanner.close();
    int[] x = new int[count]; 
    StringBuffer list = setQueen(x,0, count);
    System.out.println(list);
    System.out.println(test);
    
    
}
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值