- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试学习 Java 中的回溯主题。这对我来说真的很困惑,因为我被困住了。问题是找到将 N 个皇后放置在 NxN 国际象棋棋盘中的方法,这样皇后就不能互相攻击。皇后可以在同行、同列和对角线攻击。我的代码是这样的:
import java.util.Scanner;
class Main {
public static void putZero(int[][] board,int n){
for(int i = 0;i<n;i++){
for(int j=0;j<n;j++){
board[i][j]=0;
}
}
}
public static void printBoard(int[][] board,int n){
for(int i = 0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(board[i][j]);
}
System.out.print("\n");
}
System.out.print("\n\n\n");
}
public static void SolveNQ(int n){
int[][] board = new int[n][n];
putZero(board,n);
if(SolveQUtil(board,0,n)==true){
printBoard(board,n);
}
}
public static boolean isSafe(int row, int col, int[][] board,int n){
int i,j;
for(i=0;i<col;i++){
if(board[row][i]==1)
return false;
}
for(i=row,j = col; i >= 0 && j >= 0; i--, j--){
if(board[i][j]==1)
return false;
}
for (i = row, j = col; j >= 0 && i < n; i++, j--)
if (board[i][j] == 1)
return false;
return true;
}
public static boolean SolveQUtil(int[][] board, int col, int n){
if(col>=n){
return true;
}
else
for(int i=0;i<n;i++){
if(isSafe(i,col,board,n)==true){
board[i][col]=1;
boolean a = SolveQUtil(board,col+1,n);
if(a==true)
return true;
else
board[i][col]=0;
}
}
return false;
}
public static void main(String[] args){
Scanner scan = new Scanner(`enter code here`System.in);
int n = scan.nextInt();;
SolveNQ(n);
}
}
它正在产生我想要的结果,但我不明白它是如何工作的。在我的方法 SolveQUtil() 中,再次调用该方法,这是“递归”的。当调用 col = 0 时,Q1 被放置在 [0,0] 处,因为没有现有的皇后。但是当递归调用 col = 1 时,它会搜索合适的位置并返回“true”。现在,SolveNQ() 不是应该在每次返回 true 时打印解决方案吗?什么时候返回false?这是如何运作的?我是初学者,有人可以一步一步向我解释这一点吗?预先感谢您。
最佳答案
SolveNQ
执行打印,但不会递归调用; SolveQUtil
(SolveNQ
调用)是递归的,并且不打印任何内容。
关于java - 解决 N 个皇后的回溯问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60822253/
最初的 N-Queen 问题是关于在 N*N 棋盘上放置 N 个皇后。 然而,我却被一位学界 friend 质疑: 有预定义皇后的 N 皇后问题的 NP 完备性证明吗? 定义是: 假设: N = 8,
我正在尝试解决 N 皇后问题。您可以在 https://leetcode.com/problems/n-queens/ 中找到问题. 对于回溯,我了解到我们可以用三个关键来解决问题: 做出选择 约束
我正在用 Java 制作国际象棋游戏。 我做了一个 JFrame,它可以让我创建棋子,这就是为什么我对任何棋子都有所有可能的走法(并且我将制作比正常国际象棋中更多的棋子)。 但是我有一个小问题,我已经
我编写了一个 N-Queens 难题的 Java 小算法(使用 c*c 棋盘)。您将在下面找到我的递归方法的代码。 它没有找到所有的解决方案。 我的功能是什么 这个想法是在主方法中第一次调用我的函数,
我写了两个程序: 通过回溯算法在没有任何威胁的情况下将 n 个皇后放在棋盘上。但这对于 big n 来说非常沉重。最后你可以运行 100 个皇后。 在没有任何爬山算法威胁的情况下,将 n 个皇后放在棋
我是一名优秀的程序员,十分优秀!