当前位置: 首页 > news >正文

【JAVA】第1关:非递归实现皇后问题

任务描述
编程要求
测试说明
任务描述
本关任务:在n×n格的棋盘上放置彼此不受攻击的 n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。用非递归算法解决该问题。

下图是一个 8 个皇后的例子,8 个皇后彼此不受攻击。

在这里插入图片描述

编程要求
请在右侧编辑器Begin-End处补充代码,完成本关任务。

测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:4(皇后的数目)

预期输出:

在这里插入图片描述

4皇后问题共有2种摆放方案
开始你的任务吧,祝你成功!

package step1;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;public class Nqueens {private int n; // 棋盘的大小,即N皇后问题的Nprivate Stack<Integer> stack; // 用于存储每一行皇后的列位置private List<int[]> solutions; // 用于存储所有解决方案// 构造函数,初始化N皇后问题的参数public Nqueens(int n) {this.n = n;this.stack = new Stack<>();this.solutions = new ArrayList<>();}// 解决N皇后问题的主方法public void solve() {int row = 0; // 当前处理的行int col = 0; // 当前处理的列// 当栈不为空或当前行小于n时,继续寻找解决方案while (!stack.isEmpty() || row < n) {// 在当前行中寻找合适的列放置皇后while (col < n) {if (isSafe(row, col)) { // 检查当前位置是否安全stack.push(col); // 将当前列位置压入栈中row++; // 进入下一行col = 0; // 重置列,从下一行的第0列开始break; // 跳出内层循环,继续处理下一行}col++; // 尝试下一列}// 如果已经处理完所有行,说明找到了一个解决方案if (row == n) {int[] solution = new int[n]; // 创建一个解决方案数组for (int i = 0; i < n; i++) {solution[i] = stack.get(i); // 将栈中的列位置复制到解决方案数组中}solutions.add(solution); // 将解决方案添加到解决方案列表中row--; // 回溯到上一行col = stack.pop() + 1; // 弹出栈顶元素,并从下一列开始继续寻找} else if (col == n) { // 如果当前行没有找到合适的列if (stack.isEmpty()) { // 如果栈为空,说明已经遍历完所有可能的组合return; // 结束程序}row--; // 回溯到上一行col = stack.pop() + 1; // 弹出栈顶元素,并从下一列开始继续寻找}}}// 检查在(row, col)位置放置皇后是否安全private boolean isSafe(int row, int col) {for (int i = 0; i < row; i++) {int placedCol = stack.get(i); // 获取第i行皇后的列位置if (placedCol == col || // 检查是否在同一列placedCol - i == col - row || // 检查是否在同一主对角线placedCol + i == col + row) { // 检查是否在同一副对角线return false; // 如果存在冲突,返回false}}return true; // 如果没有冲突,返回true}// 打印所有解决方案public void printSolutions() {for (int[] solution : solutions) {for (int i = 0; i < solution.length; i++) {System.out.print("  "); // 打印行前缀空格for (int j = 0; j < solution.length; j++) {if (solution[i] == j) { // 如果当前位置是皇后System.out.print("Q"); // 打印皇后} else {System.out.print("*"); // 否则打印空位}if (j < solution.length - 1) {System.out.print("  "); // 打印列间空格}}System.out.println(); // 换行}System.out.println(); // 打印解决方案之间的空行}System.out.println(n + "皇后问题共有" + solutions.size() + "种摆放方案"); // 打印解决方案总数}// 主函数,程序入口public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(); // 读取用户输入的N值scanner.close();Nqueens nQueens = new Nqueens(n); // 创建N皇后问题的实例nQueens.solve(); // 解决N皇后问题nQueens.printSolutions(); // 打印所有解决方案}
}

http://www.mrgr.cn/news/65756.html

相关文章:

  • Aurora 64b/66bIP核学习
  • 类被加载到jvm后再被注册到Spring中
  • 进度条的实现(配合make和makefile超详细)
  • Redis 的使⽤和原理
  • OpenCV中使用EdgeDrawing模块查找圆
  • 数据结构与算法——Java实现 53.力扣938题——二叉搜索树的范围和
  • 危机来临前---- 力扣: 876
  • 【AI日记】24.11.04 ANN和HNSW算法的代码实现
  • Android音频进阶之PCM设备创建(九十三)
  • Cesium的PickModel浅析
  • multKAN
  • 【基于LSM的ELF文件安全模块设计】参考
  • 【SpringBoot实践】编写一个自定义的starter,简单聊聊自动装配原理
  • 【强化学习理论基础-通用】(13)从零开始白话给你讲[数学原理]:蒙特卡洛(MC Basic),model-base 到 model-free 关键之处
  • Redis-“自动分片、一定程度的高可用性”(sharding水平拆分、failover故障转移)特性(Sentinel、Cluster)
  • Vue全栈开发旅游网项目(5)-景点详情模块API接口设计
  • 【论文速看】DL最新进展20241104-自动驾驶、图像超分、目标检测
  • Centos7.6离线安装软件
  • Flutter UI架构(3)
  • 2024年11月1日——世间轮回
  • Diffusion Model
  • Linux高阶——1103—修改屏蔽字信号到达及处理流程时序竞态问题
  • 论文翻译 | Evaluating the Robustness of Discrete Prompts
  • vulhub之phpmyadmin
  • DBA之路,始于足下
  • C++基础:测试