N皇后,回溯【java】

问题描述

八皇后问题是十九世纪著名的数学家高斯于1850年提出的。

问题是:在8×8的棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。可以把八皇后问题扩展到n皇后问题,即在n×n的棋盘上摆放n个皇后,使任意两个皇后都不能处于同一行、同一列或同一斜线上

显然,棋盘的每一行上可以而且必须摆放一个皇后,所以,n皇后问题的可能解用一个n元向量X=(x1, x2, …, xn)表示,其中,1≤i≤n并且1≤xi≤n,即第i个皇后放在第i行第xi列上。

由于两个皇后不能位于同一列上,所以,解向量X必须满足约束条件:

             xi≠xj                    (式8.1)

若两个皇后摆放的位置分别是(i, xi)和(j, xj),在棋盘上斜率为-1的斜线上,满足条件i-j= xi-xj,在棋盘上斜率为1的斜线上,满足条件i+j= xi+xj,综合两种情况,由于两个皇后不能位于同一斜线上,所以,解向量X必须满足约束条件:

            |i-xi|≠|j-xj|           (式8.2)

四皇后问题示例

 

实验目的

(1)掌握回溯算法的设计思想;

(2)掌握解空间树的动态生成过程。

实验要求

(1)设计解空间树的动态生成算法,并设计剪枝函数加快搜索速度;

(2)将上面图例(四皇后问题)按回溯算法搜索并输出全部的解。

核心思路:

使用递归+回溯

1.初始化棋盘全部为“.

2.从第一行开始,遍历该行的每一个位置,符合的填为“Q”,不符合的跳过,再递归下一行,遍历完下一行后,将该行当前位置又重置为“.”,这一过程就是回溯的过程。依次 遍历进行判断每一行。

判断位置是否可以放“Q”:

算法实现:

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;public class S51 {List<List<String>> res = new LinkedList<>();public List<List<String>> solveNQueens(int n) {char[][] borad = new char[n][n];//初始化棋盘for (int i = 0; i < borad.length; i++) {Arrays.fill(borad[i], '.');}backtrack(0, borad);return res;}/*** 第row行的填充结果* @param row 到第row行* @param borad 棋盘*/private void backtrack(int row, char[][] borad) {if (row < 0 || row > borad.length) {return;}if (row == borad.length) {List<String> item = new LinkedList<>();for (int i = 0; i < borad.length; i++) {StringBuffer sb = new StringBuffer();for (int j = 0; j < borad[0].length; j++) {//方便打印结果一目了然添加“\t”sb.append(borad[i][j]+"\t");//改为sb.append(borad[i][j]),即可解决力扣51题}item.add(sb.toString());}res.add(item);return;}int n = borad[row].length;//对row行的每个位置进行判断是否符合放皇后的位置for (int col = 0; col < n; col++) {if (!isfang(row, col, borad)) {//已放过,即不符合continue;}borad[row][col] = 'Q';//进入下层决策backtrack(row + 1, borad);//回溯borad[row][col] = '.';}}/*** 判断【row,col】位置是否可以放皇后* @param row 行* @param col 列* @param borad 棋盘* @return true 可放*/private boolean isfang(int row, int col, char[][] borad) {int n = borad.length;//竖直上方for (int k = 0; k <= row; k++) {if (borad[k][col] == 'Q') {return false;}}//右上方for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {if (borad[i][j] == 'Q') {return false;}}//左上方for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {if (borad[i][j] == 'Q') {return false;}}return true;}public static void main(String[] args) {S51 s51 = new S51();int n = 4;List<List<String>> lists = s51.solveNQueens(n);System.out.println(n+" 皇后的解法如下:");for (int i = 0; i < lists.size(); i++) {List<String> res = lists.get(i);System.out.println("结果"+(i+1)+":");for (int j = 0; j < res.size(); j++) {System.out.println(res.get(j));}System.out.println();}}
}

 输出结果:

将以上代码中‘sb.append(borad[i][j]+"\t")’改为sb.append(borad[i][j]),就可以提交通过力扣51题 

51. N 皇后

 

快去提交吧~~~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理类联考——数学——真题篇——按知识分类——几何

文章目录 2023真题(2023-07)-几何-解析几何-最值真题(2023-10)-几何-立体几何-正方体:体积: V = a 3 V=a^3 V

AX和A(T)X的区别是?

目录 1.快速了解的例子&#xff1a; &#xff08;1&#xff09;假设所有节点的初始特征都是[1, 0, 0] &#xff0c;那么AX的结果是&#xff1a; &#xff08;2&#xff09; 的结果是&#xff1a; (3) 总结&#xff1a; 2.计算结构系数的例子 &#xff08;1&#xff09…

day45-46-Vue+ElementUI实现学生管理

VueElementUI实现学生管理 代码&#xff1a; qiushiju/java2313_vue_elementui_crud (gitee.com) 一、思考 考虑需求&#xff08;登录&#xff0c;查询全部&#xff0c;基本增删改查&#xff0c;分页&#xff0c;搜索&#xff0c;批量&#xff09; 设计数据库搭建项目 后端…

2024美赛备战2--模型建立(*****必看****)

建模 美赛涉及的建模知识范围非常广且深&#xff0c;纵观美赛真题不难发现&#xff0c;很多的模型 都是读研或者读博的时候才会真正深入开始研究&#xff0c;因此&#xff0c;对于做建模的同学来说&#xff0c; 是无法在赛前吃透大量模型的。推荐本科生分两个步骤去有效准备比赛…

【S32DS RTD实战】-1.3-S32K3工程生成S19,BIN,Hex文件,以及Post-build steps的妙用

目录 1 方法一&#xff1a;逐个生成Motorola S-record&#xff08;s19&#xff0c;srec…&#xff09;&#xff0c;Intel HEX&#xff0c;Bin文件 1.1 生成Motorola S-record&#xff08;s19&#xff0c;srec…&#xff09;文件 1.2 生成Intel HEX文件 1.3 生成Bin文件 2 …

python的Streamlit库的text_input组件

text_input 常用的输入组件&#xff0c;这里注意记录一下具体的参数&#xff0c;方便使用 函数签名 st.text_input(label, value"", max_charsNone, keyNone, type"default", helpNone, autocompleteNone, on_changeNone, argsNone, kwargsNone, *, pla…

【LeetCode】414. 第三大的数

414. 第三大的数 难度&#xff1a;简单 题目 给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 示例 1&#xff1a; 输入&#xff1a;[3, 2, 1] 输出&#xff1a;1 解释&#xff1a;第三大的数是 1 。示例 2&#xf…

计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密数据恢复

网络技术的不断发展&#xff0c;也为网络安全带来了威胁&#xff0c;近期云天数据恢复中心的工程师陆续接到很多企业的求助&#xff0c;在本月&#xff0c;很多企业的计算机服务器遭到了mkp勒索病毒攻击&#xff0c;导致企业计算机系统瘫痪&#xff0c;无法正常工作&#xff0c…

vue生命周期和路由

Vue.js 生命周期是Vue.js实例从创建到销毁的整个过程中所经过的一系列事件&#xff0c;可以理解为Vue.js的生命周期钩子函数。在这些生命周期钩子函数中&#xff0c;你可以添加自定义的逻辑代码&#xff0c;以便在组件生命周期的不同阶段进行不同的操作。Vue.js生命周期共分为八…

Linux的ps简单实现

原理&#xff1a;遍历下的/proc/%s/task/%s/status所有文件&#xff0c;两个%s都为pid号。 注&#xff1a;多线程下&#xff0c;只打印一个pid/task下的所有目录&#xff0c;即可收集各个线程对应的信息。 $ cat ps.c #include <stdio.h> #include <stdlib.h> #in…

《深入理解计算机系统》学习笔记 - 第四课 - 机器级别的程序

Lecture 05 Machine Level Programming I Basics 机器级别的程序 文章目录 Lecture 05 Machine Level Programming I Basics 机器级别的程序intel 处理器的历史和体系结构芯片的构成AMD 公司(Advanced Micro Devices&#xff0c;先进的微型设备) C, 汇编, 机器代码定义汇编/机器…

2024美赛备战1--数据处理(数据预处理,异常值处理,预测模型,插值拟合 *****必看****)

1.数据预处理 所谓数据预处理&#xff0c;就是指在正式做题之前对数据进行的一些处理。在有些情 况下&#xff0c;出题方提供的数据或者网上查找的数据并不能直接使用&#xff0c;比如缺少数据甚 至是异常数据&#xff0c;如果直接忽略缺失值&#xff0c;或者没发现异常数据&am…

angular material mat-error 失效不展示

1.你命名了控制mat-error显示与否的变量&#xff0c;却没有在html里使用 2.mat-error是放在mat-form-field里才生效的&#xff0c;如果 <input matInput required formControlName"phoneNumber" /> 中的phoneNumber其实是valid&#xff0c;通过验证的&#x…

【KALI】设置静态IP地址

ip: 192.168.1.10/24 网关&#xff1a;192.168.1.1 DNS&#xff1a;192.168.1.254/etc/network/interfaces原始文件内容为&#xff1a; # This file describes the network interfaces available on your system # and how to activate them. For more information, see inter…

数字图像处理(实践篇)二十一 人脸识别

目录 1 安装face_recognition 2 涉及的函数 3 人脸识别方案 4 实践 使用face_recognition进行人脸识别。 1 安装face_recognition pip install face_recognition 或者 pip --default-timeout100 install face_recognition -i http://pypi.douban.com/simple --trusted-…

川崎ZX-6R确定引进,636它真的来了,3C认证已过。

最新消息&#xff0c;兄弟们&#xff0c;你们期待已久的川崎ZX6R&#xff08;636&#xff09;基本已经确定引进了&#xff0c;官方的3C认证已经通过&#xff0c;那么从3C里面我们可以看到哪几个信息&#xff1f;产品代号ZX636J就是心心念念的ZX-6R了。 有些小伙伴不太清楚3C认…

t-SNE完整笔记 (附Python代码)

t-SNE(t-distributed stochastic neighbor embedding)是用于降维的一种机器学习算法&#xff0c;是由 Laurens van der Maaten 和 Geoffrey Hinton在08年提出来。此外&#xff0c;t-SNE 是一种非线性降维算法&#xff0c;非常适用于高维数据降维到2维或者3维&#xff0c;进行可…

laravel定时任务配置手册

任务调度在 app/Console/Kernel.php 的 schedule 方法中进行定义&#xff1b; 分配多种调度计划&#xff1a;结合其他一些特定条件&#xff0c;我们可以生成在一周中特定时间运行的任务。举个例子&#xff0c;在每周一执行命令&#xff1a; 方法 描述 ->cron(* * * * *); …

分配栈空间的三种方式(基于适配qemu的FreeRTOS分析)

1、定义全局的数组 定义的全局数组属于bss段&#xff0c;相当于把bss段的一部分作为栈空间&#xff0c;栈空间的大小就是数组的大小如果把栈空间放在bss段&#xff0c;则在bss段清零时会多清零一段地址空间 2、在链接脚本中指定 用链接脚本在所有段的后面增加stack段&#xff…

15:00面试,15:06就出来了,问的问题真变态。。。

刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到5月一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资还要降…