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.pswp.cn/news/214811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214811.shtml
英文地址,請注明出處:http://en.pswp.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;薪資還要降…