- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
经过一个月的调试,我编写了这个程序,我终于让它工作了,但是它只打印 1
解决 8
皇后问题,有谁知道什么我可以做些什么来让它打印所有的解决方案?代码会很有帮助,但如果您能指出要更改或添加的内容,我也可以使用。
import java.util.Scanner;
public class Queens
{
// squares per row or column
public static final int BOARD_SIZE = 8;
// used to indicate an empty square
public static final int EMPTY = 0;
// used to indicate square contains a queen
public static final int QUEEN = 1;
private int board[][]; // chess board
public Queens() {
// -------------------------------------------------
// Constructor: Creates an empty square board.
// -------------------------------------------------
board = new int[BOARD_SIZE][BOARD_SIZE];
} // end constructor
public void clearBoard() {
// -------------------------------------------------
// Clears the board.
// Precondition: None.
// Postcondition: Sets all squares to EMPTY.
// -------------------------------------------------
for(int j = 1; j < 8; j++)
{
for(int k = 1; k < 8; k++) //Sets every column in this row to 0
{
board[j][k] = 0;
}
//moves on to next row and repeats
}
} // end clearBoard
public void displayBoard() {
// -------------------------------------------------
// Displays the board.
// Precondition: None.
// Postcondition: Board is written to standard
// output; zero is an EMPTY square, one is a square
// containing a queen (QUEEN).
// -------------------------------------------------
placeQueens(1);
int N = board.length;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (board[i][j] == 1)
{
System.out.print("Q ");
}
else
{
System.out.print("_|");
}
}
System.out.println();
}
} // end displayBoard
public boolean placeQueens(int column) {
// -------------------------------------------------
// Places queens in columns of the board beginning
// at the column specified.
// Precondition: Queens are placed correctly in
// columns 1 through column-1.
// Postcondition: If a solution is found, each
// column of the board contains one queen and method
// returns true; otherwise, returns false (no
// solution exists for a queen anywhere in column
// specified).
// -------------------------------------------------
if (column > BOARD_SIZE) {
return true; // base case
}
else {
boolean queenPlaced = false;
int row = 1; // number of square in column
while ( !queenPlaced && (row <= BOARD_SIZE) ) {
// if square can be attacked
if (isUnderAttack(row, column)) {
++row; // consider next square in column
} // end if
else { // place queen and consider next column
setQueen(row, column);
queenPlaced = placeQueens(column+1);
// if no queen is possible in next column,
if (!queenPlaced) {
// backtrack: remove queen placed earlier
// and try next square in column
removeQueen(row, column);
++row;
} // end if
} // end if
} // end while
return queenPlaced;
} // end if
} // end placeQueens
private void setQueen(int row, int column) {
// --------------------------------------------------
// Sets a queen at square indicated by row and
// column.
// Precondition: None.
// Postcondition: Sets the square on the board in a
// given row and column to QUEEN.
// --------------------------------------------------
row = index(row);
column = index(column);
board[row][column] = 1; //Queen placed on square
} // end setQueen
private void removeQueen(int row, int column) {
// --------------------------------------------------
// Removes a queen at square indicated by row and
// column.
// Precondition: None.
// Postcondition: Sets the square on the board in a
// given row and column to EMPTY.
// --------------------------------------------------
column = index(column);
for(int x = 0; x < 8 ; x++)
{
if(board[x][column] == 1)
{
board[x][column] = 0;
x = 8;
}
}
} // end removeQueen
private boolean isUnderAttack(int row, int column) {
// --------------------------------------------------
// Determines whether the square on the board at a
// given row and column is under attack by any queens
// in the columns 1 through column-1.
// Precondition: Each column between 1 and column-1
// has a queen placed in a square at a specific row.
// None of these queens can be attacked by any other
// queen.
// Postcondition: If the designated square is under
// attack, returns true; otherwise, returns false.
// --------------------------------------------------
//Taking 1-8 & returning 0-7 to suite array
row = index(row);
column = index(column);
//Checks the rows & columns
//Rows
for(int i = 0; i < column && i < 8 && row < 8; i++)
{
//If there's a queen in that row, the queen is under attack
if(board[row][i] == 1)
{
return true;
}
}
//Column
for(int j = 0; j < row && j < 8 && column < 8; j++)
{
//If there's a queen in that column, the queen is under attack
if(board[j][column] == 1)
{
return true;
}
}
//Check diagonals
for(int i = row, j = column; i >= 0 && j >= 0 && i < 8 && j < 8; i--, j--)
{
//checks upper diagonal
if(board[i][j] == 1)
{
return true;
}
}
for(int i = row, j = column; i < board.length && j >= 0 && i < 8 && j < 8; i++, j--)
{
//checks lower diagonal
if(board[i][j] == 1)
{
return true;
}
}
//At this point the Queen is not being attacked
return false;
} // end isUnderAttack
private int index(int number) {
// --------------------------------------------------
// Returns the array index that corresponds to
// a row or column number.
// Precondition: 1 <= number <= BOARD_SIZE.
// Postcondition: Returns adjusted index value.
// --------------------------------------------------
return number - 1;
}// end index
public static void main(String[] args)
{
Queens eight = new Queens();
eight.displayBoard();
}
} // end Queens
最佳答案
displayBoard是您的驾驶习惯;不要让它在显示一个解决方案后停止,而是将其包装在一个循环中,只要 placeQueens 能够找到新的解决方案,该循环就会继续下去。
这意味着您需要调整placeQueens以从之前的棋盘状态继续。它已经在很大程度上做到了这一点;您只需要处理它到达最后一列的情况。例如,将第 8 个皇后向下移动一格,然后从上次停下的位置继续前进,或者返回到第 7 个皇后的下一个合法位置(因为您知道第 8 个皇后没有其他合法位置)。
在执行此操作时,您需要稍微更改这两个例程之间的接口(interface),以便 placeQueens 不仅可以返回每个解决方案,还可以返回全部完成条件。这告诉 displayBoard 跳出循环(您添加的新包装器)。
这些描述足以让您继续前进吗?
<小时/>在“不是真的”评论后进行编辑...
也许最容易编写的包装器是在 displayBoard 中。在顶部,您有 placeQueens(1),请改为使用
col = 1
while(placeQueens(col)) {
... print the board as usual
... remove 8th queen; mark its position as unusable (say, with a value of -1)
col = 8
}
调整 placeQueens,以便它从上次停止的位置继续:它将希望将第 8 个皇后放在同一个位置。当它发现该位置被标记为不可用时,重置标记并回溯到第 7 个皇后。此操作将让它继续并找到所有解决方案。
有更简洁的方法可以做到这一点,但我认为这个方法足以保留您当前的组织。理想情况下,您应该有一个在放置和打印过程中循环的驱动程序,但这主要是命名和上层组织的问题。
这能让你移动得足够好吗?
关于java - N Queens 所有解决方案,目前显示 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36607672/
我只是想知道要安装哪个版本的 Visual Studio 2010(专业版或高级版)提示升级项目.. 项目包括:asp.net mvc、数据库和silverlight。 最佳答案 通常,由不同版本的相
几种通过 iproute2 来打通不同节点间容器网络的方式 几种通过 iproute2 来打通不同节点间容器网络的方式 host-gw ipip vxlan 背景 之前由于需
目录 前言 1、TypeHandler 简介 1.1转换步骤 1.2转换规则 2、JSON 转换 3、枚举转换 4、文章小结
目录 前言 1、常见 key-value 2、时效性强 3、计数器相关 4、高实时性 5、排行榜系列 6、文章小结 前言 在笔者 3 年的
目录 前言 四、技术选型 五、后端接口设计 5.1业务系统接口 5.2App 端接口 六、关键逻辑实现 6.1Red
目录 前言 一、需求分析 1.1发送通知 1.2撤回通知 1.3通知消息数 1.4通知消息列表 二、数据模型设计
目录 前言 一、多租户的概念 二、隔离模式 2.1独立数据库模式 2.2共享数据库独立数据架构 2.3共享数据库共享数据架构
导读: 虽然锁在一定程度上能够解决并发问题,但稍有不慎,就可能造成死锁。本文介绍死锁的产生及处理。 死锁的产生和预防 发生死锁的必要条件有4个,分别为互斥条件、不可剥夺条件、请求与保持条件和循环等待条
在浏览网页后,我找不到任何功能来执行此操作,我有可行的个人解决方案。也许它对某人有用。 **使用 Moment 插件转换日期。***moment(currentPersianDate).clone()
是否有一种解决方案可以很好地处理数字(1-10)手写?我试过tesseract,但我得到的只是垃圾。 理想情况下是 OSS,但商业也可以。 最佳答案 OpenCV 现在带有手写数字识别 OCR 示例。
在服务器应用程序上,我们有以下内容:一个称为 JobManager 的单例类。另一个类,Scheduler,不断检查是否需要向 JobManager 添加任何类型的作业。 当需要这样做时,调度程序会执
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 5年前关闭。 Improve this qu
当您尝试从 GitHub 存储库安装某些 R 包时 install_github('rWBclimate', 'ropensci') 如果您遇到以下错误: Installing github repo
问题在以下链接中进行了描述和演示: Paul Stovell WPF: Blurry Text Rendering www.gamedev.net forum Microsoft Connect: W
我正在寻找一种解决方案,使用标准格式 a × 10 b 在科学记数法下格式化 R 中的数字。一些同行评审的科学期刊都要求这样做,并且手动修改图表可能会变得乏味。 下面是 R 标准“E 表示法”的示例,
已编辑解决方案(如下...) 我有一个启动画面,它被打包到它自己的 jar 中。它有效。 我可以通过以下方式从另一个 java 应用程序内部调用 Splash.jar: Desktop.getDesk
什么是创建像 PageFlakes 或 iGoogle 这样的门户网站的好框架/包? ?我们希望创建一个为员工提供 HR 服务的员工/HR 门户,但我们也需要一种足够灵活的产品,以便我们可以使用它来为
我正在寻找一种解决方案,使用标准格式 a × 10 b 在科学记数法下格式化 R 中的数字。一些同行评审的科学期刊都要求这样做,并且手动修改图表可能会变得乏味。 下面是 R 标准“E 表示法”的示例,
如何将 solr 与 heritrix 集成? 我想使用 heritrix 归档一个站点,然后使用 solr 在本地索引和搜索该文件。 谢谢 最佳答案 使用 Solr 进行索引的问题在于它是一个纯文本
完整日历不包含工作时间功能选项(在任何一天的议程 View 中选择第一行和最后一行 - 例如公司不工作)。我做到了类似的事情: viewDisplay: function(view){
我是一名优秀的程序员,十分优秀!