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

本文详细介绍了N皇后问题的求解思路与算法实现,通过一维数组表示棋盘布局,确保皇后间不互相攻击,利用递归遍历所有可能布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
    
    
}
}
 

 

好的,以下是采用回溯法求解 n 皇后问题Java 代码: ```java public class NQueenProblem { private int[] queens; // 保存皇后的列号,其下标表示号 private int n; // 皇后个数 public NQueenProblem(int n) { this.n = n; queens = new int[n]; } // 判断当前皇后摆放位置是否合法 private boolean isValid(int row, int col) { for (int i = 0; i < row; i++) { if (queens[i] == col || Math.abs(row - i) == Math.abs(col - queens[i])) { return false; } } return true; } // 回溯求解 n 皇后问题 private void backtrack(int row) { // 找到一个可解 if (row == n) { printQueens(); return; } // 尝试在当前的每一列上放置皇后 for (int col = 0; col < n; col++) { if (isValid(row, col)) { queens[row] = col; backtrack(row + 1); } } } // 打印皇后的位置 private void printQueens() { for (int row = 0; row < n; row++) { for (int col = 0; col < n; col++) { if (queens[row] == col) { System.out.print("Q "); } else { System.out.print("* "); } } System.out.println(); } System.out.println(); } public static void main(String[] args) { NQueenProblem problem = new NQueenProblem(4); problem.backtrack(0); } } ``` 在 `NQueenProblem` 类中,我们首先定义了一个 `isValid` 方法,用于判断当前皇后摆放位置是否合法。具体来说,我们需要检查当前皇后是否与前面的皇后在同一列或同一斜线上。如果是,则说明当前位置不合法。 然后,我们定义了一个 `backtrack` 方法,用于回溯求解 n 皇后问题。在该方法中,我们首先判断是否找到了一个可解。如果是,则打印当前皇后的位置。然后,我们尝试在当前的每一列上放置皇后,并递归地调用 `backtrack` 方法来处理下一。 最后,在 `main` 方法中,我们实例化了一个 `NQueenProblem` 对象,并调用 `backtrack` 方法来求解 n 皇后问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值