八皇后問題分析與Java實現

原文鏈接:傳送門

八皇后問題

八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾于1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即:任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。

img img

八皇后問題算法思路分析

  1. 第一個皇后先放第一行第一列
  2. 第二個皇后放在第二行第一列、然后判斷是否OK, 如果不OK,繼續放在第二列、第三列、依次把所有列都放完,找到一個合適
  3. 繼續第三個皇后,還是第一列、第二列……直到第8個皇后也能放在一個不沖突的位置,算是找到了一個正確解
  4. 當得到一個正確解時,在棧回退到上一個棧時,就會開始回溯,即將第一個皇后,放到第一列的所有正確解,全部得到.
  5. 然后回頭繼續第一個皇后放第二列,后面繼續循環執行 1,2,3,4的步驟 【示意圖】

說明

理論上應該創建一個二維數組來表示棋盤,但是實際上可以通過算法,用一個一維數組即可解決問題. arr[8] = {0 , 4, 7, 5, 2, 6, 1, 3} //對應arr 下標 表示第幾行,即第幾個皇后,arr[i] = val , val 表示第i+1個皇后,放在第i+1行的第val+1

使用到回溯算法

高斯認為有76種方案。1854年在柏林的象棋雜志上不同的作者發表了40種不同的解,后來有人用圖論的方法解出92種結果。計算機發明后,有多種計算機語言可以解決此問題

package com.atguigu.recursion;public class Queen8 {// 一共有多少個皇后(此時設置為8皇后在8X8棋盤)int max = 8;// 該數組保存結果,第一個皇后擺在array[0]列,第二個擺在array[1]列int[] array = new int[max];static int count = 0;public static void main(String[] args) {Queen8 queen8 = new Queen8();queen8.check(0);System.out.println("一共有" + count + "種解法");}/*** n代表當前是第幾個皇后 [n 是從 0 開始算的,即0 表示第一個皇后, 同時n也表示第幾行]* 即 第1行是第一個皇后(n=0),第2行是第二個皇后(n=1), 第8行是第8個皇后(n=7),如果遍歷到第9行(n=8),說明* 皇后全部放置好了, 就相應的得到了一種解法...* 然后回溯 ,又將第一個皇后,放置第1行的第2列...** @param n 皇后n在array[n]列*/private void check(int n) {//終止條件是最后一行已經擺完,//由于每擺一步都會校驗是否有沖突,//所以只要最后一行擺完,說明已經得到了一個正確解if (n == max) {print();return;}//將第n個皇后從.第一列開始放值,然后判斷是否和本行本列本斜線有沖突,如果OK,就進入下一行的邏輯for (int i = 0; i < max; i++) {array[n] = i; //先將第一個皇后放置第一行的第一列 array[0] = 0if (judge(n)) {  // 如果 該皇后沒有和其它皇后沖突check(n + 1); // 放第二個皇后,因為是遞歸,因此大家可以思考,第二個皇后是從 第二行的第1列開始放}}}/*** 查看n皇后是否滿足約束條件(即:檢查皇后n是否會發生沖突)* 如果沖突,返回 false , 如果不沖突返回true* 0 4 7 5 2 6 1 3** @param n* @return*/private boolean judge(int n) {for (int i = 0; i < n; i++) {//說明: //1. array[i] == array[n] 判斷 是不是在同一列//2. Math.abs(n - i) == Math.abs(array[n] - array[i]) 判斷是不是在同一條斜線//3. 不用判斷是不是在同一行,因為我們每放一個皇后,行是遞增的.if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {return false;}}return true;}/*** 打印這個滿足條件的八皇后的放置位置*/private void print() {count++;for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}System.out.println();}
}

判斷斜線的時候,直接用 橫坐標減去縱坐標,若,兩個位置的差值相等,

就是同一個斜線上的

然而,這個上面例子中,存放的方式是:

一維數組: 數組的下標代表棋盤的行號,數組的值代表棋盤的列號

數組中員孫的個數即為 皇后的 棋子

在記性斜線判斷的時候,計算的是,兩點的橫向差值和縱向差值是否相等,若相等,則,斜率為1,即tan45° 嗯, 就判斷出了是在一個斜線上,皇后能夠互相攻擊,嗯,哦可,秒啊

img

原文鏈接:傳送門

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455079.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455079.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455079.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

各種音視頻編解碼學習詳解 h264 ,mpeg4 ,aac 等所有音視頻格式

編解碼學習筆記&#xff08;一&#xff09;&#xff1a;基本概念 媒體業務是網絡的主要業務之間。尤其移動互聯網業務的興起&#xff0c;在運營商和應用開發商中&#xff0c;媒體業務份量極重&#xff0c;其中媒體的編解碼服務涉及需求分析、應用開發、釋放license收費等等。最…

shell 腳本比較字符串相等_shell腳本--邏輯判斷與字符串比較

涉及到比較和判斷的時候&#xff0c;要注意整數比較使用-lt&#xff0c;-gt&#xff0c;ge等比較運算符&#xff0c;詳情參考&#xff1a;整數比較文件測試使用 -d, -f, -x等運算發&#xff0c;詳情參考&#xff1a;文件測試邏輯判斷使用 &&(且)、||(或)、&#xff…

單例模式之惡漢模式(詳解)

一.設計模式 概念&#xff1a;設計模式是一套被反復使用、多人知曉的、經過分類編目的、代碼設計經驗的總結。 目的&#xff1a;是用設計模式可以重用代碼&#xff0c;讓代碼更容易被他人理解&#xff0c;保證代碼的可靠性。 二.為什么要使用單例模式&#xff1f; 如果創造出多…

JSP中的:request.getScheme()+://+request.getServerName()+:+request.getServer

String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/"; <base href" <%basePath%>"> 這個語句是用來拼裝當前網頁的相對…

迷宮回溯問題分析和實現

原文鏈接:傳送門 迷宮問題 說明: 小球得到的路徑&#xff0c;和程序員設置的找路策略有關即&#xff1a;找路的上下左右的順序相關再得到小球路徑時&#xff0c;可以先使用(下右上左)&#xff0c;再改成(上右下左)&#xff0c;看看路徑是不是有變化測試回溯現象思考: 如何求出…

canvas clear 指定屬性的元素_好程序員web前端分享CSS屬性組成及作用

好程序員web前端分享CSS屬性組成及作用學習目標1、css屬性和屬性值的定義2、css文本屬性3、css列表屬性4、css背景屬性5、css邊框屬性6、css浮動屬性一、css屬性和屬性值的定義屬性&#xff1a;屬性是指定選擇符所具有的屬性&#xff0c;它是css的核心&#xff0c;css2共有150多…

mybatis大于小于等于

大于&#xff1a;<![CDATA[>]]> 小于&#xff1a;<![CDATA[<]]> 等于&#xff1a;<![CDATA[]]> 大于等于&#xff1a;<![CDATA[>]]> 小于等于&#xff1a;<![CDATA[<]]>轉載于:https://www.cnblogs.com/YuanFan123/p/7234530.html

2017年秋招-廣聯達面試及思考

面試官提問&#xff1a; 自我介紹&#xff08;沒有做充分的準備&#xff0c;總感覺說的不好&#xff09;為什么選擇做前端&#xff1f;在前端方向&#xff0c;你認為自身有哪些優點&#xff1f;前端需要掌握哪些技術知識點&#xff1f;看過哪些比較好的網站&#xff1f;會不會使…

排序算法介紹和分類

原文鏈接:傳送門 排序算法的介紹 排序也成排序算法 排序也稱排序算法(Sort Algorithm)&#xff0c;排序是將一組數據&#xff0c;依指定的順序進行排列的過程。 排序的分類&#xff1a; 1) 內部排序: 指將需要處理的所有數據都加載到**內部存儲器(內存)**中進行排序。 2) 外…

認識高清視頻編碼(MPEG、H.264、WMV-HD、RMVB)

文章出處&#xff1a;www.net1980.com 原創 最近兩年&#xff0c;“高清”這個詞語非常火熱&#xff0c;已經成為家電和IT行業的最新潮流了。高清視頻和普通視頻有什么區別呢&#xff1f;主要是分辨率上的區別&#xff0c;720P視頻的分辨率為1280X720&#xff0c;1080P視頻的分…

解讀SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC

SPP與SPPF 一、SPP的應用的背景 在卷積神經網絡中我們經常看到固定輸入的設計&#xff0c;但是如果我們輸入的不能是固定尺寸的該怎么辦呢&#xff1f; 通常來說&#xff0c;我們有以下幾種方法&#xff1a; &#xff08;1&#xff09;對輸入進行resize操作&#xff0c;讓他們…

go mongodb排序查詢_《MongoDB》day two

Mongodb的更新方式有&#xff1f;db.集合名.update() 函數:用于更新已存在的文檔。語法格式&#xff1a;db.COLLECTION_NAME.update({查詢條件},{更新內容},{更新參數(可選)}) 注&#xff1a;這種方式會覆蓋原有的文檔。使用更新操作符 使用 save()函數更新文檔 Mongodb的updat…

【轉】 JMeter學習(二十四)linux啟動jmeter,執行./jmeter.sh報錯解決方法

1.l-bash: ./jmeter.sh: Permission denied解決辦法&#xff1a;jmeter.sh的執行權限改改&#xff0c;是權限不夠chmod 777 jmeter.sh2.An error occurred:No X11 DISPLAY variable was set, but this program performed an operation which requires it.步驟一&#xff1a;Lin…

哈希表思路圖解和代碼實現

原文鏈接傳送門 哈希表(散列)-Google上機題 看一個實際需求&#xff0c;google公司的一個上機題: 有一個公司,當有新的員工來報道時,要求將該員工的信息加入(id,性別,年齡,住址…),當輸入該員工的id時,要求查找到該員工的 所有信息. 要求: 不使用數據庫,盡量節省內存,速度越…

android開發學習——Mina框架

Apache Mina Server 是一個網絡通信應用框架&#xff0c;對socket進行了封裝。 http://www.cnblogs.com/moonandstar08/p/5475766.html http://blog.csdn.net/u010739551/article/details/47361365 http://www.cnblogs.com/yanghuiping/p/4108063.html &#xff08;mina 自定…

glibc交叉編譯_TSN之linuxptp交叉編譯

0 開發環境1 linuxptp是什么2 為什么要交叉編譯linuxptp3 修改makefile4 修改源碼5 交叉編譯0 開發環境筆記本&#xff1a;ubuntu18.04.5&#xff0c;內核版本為5.3 開發板&#xff1a;imx8mp-evk內核版本&#xff1a;Linux5.4.24交叉編譯工具鏈&#xff1a;fsl-imx-xwayland-g…

230. Kth Smallest Element in a BST

題目&#xff1a; Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Note: You may assume k is always valid, 1 ≤ k ≤ BSTs total elements. Follow up:What if the BST is modified (insert/delete operations) often …

聲音編碼

1.脈沖編碼調制PCM文件格式簡介 將音頻數字化&#xff0c;其實就是將聲音數字化。最常見的方式是透過脈沖編碼調制PCM(Pulse Code Modulation) 。運作原理如下。首先我們考慮聲音經過麥克風&#xff0c;轉換成一連串電壓變化的信號&#xff0c;如圖一所示。這張圖的橫座標為秒&…

Elastic Stack簡介

Elastic Stack簡介 如果你沒有聽說過Elastic Stack&#xff0c;那你一定聽說過ELK&#xff0c;實際上ELK是三款軟件的簡稱&#xff0c;分別是Elasticsearch、 Logstash、Kibana組成&#xff0c;在發展的過程中&#xff0c;又有新成員Beats的加入&#xff0c;所以就形成了Elast…

webpack v3 結合 react-router v4 做 dynamic import — 按需加載(懶加載)

為什么要做dynamic import&#xff1f; dynamic import不知道為什么有很多叫法&#xff0c;什么按需加載&#xff0c;懶加載&#xff0c;Code Splitting&#xff0c;代碼分頁等。總之&#xff0c;就是在SPA&#xff0c;把JS代碼分成N個頁面份數的文件&#xff0c;不在用戶剛進來…