leetcode 51. N 皇后 思考分析

目錄

    • 題目
    • 思考
    • AC代碼

題目

n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,并且使皇后彼此之間不能相互攻擊。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

思考

首先以N=4為例,畫出解空間樹的一部分:
在這里插入圖片描述

根據模板:

void backtracking(參數)
{if(終止條件){存放結果;return;}for(選擇:本層集合中元素(樹中結點孩子的數量就是集合的大小)){處理結點;backtracking(路徑,選擇列表);		//遞歸回溯,撤銷處理結果;}
}

1、確定回溯函數參數,返回值
當前所在的行(層),當前的棋盤布局。
N的大小

void backtracking(int hang,vector<string>& chessboard,int n)

全局變量:vector<vector>result;
result是個存放chessboard的變量。
這里的chessboard就相當于之前回溯題目中的path、子結果。
2、確定終止條件:
當遍歷到N的最后一層(n-1)時,再往下一層,我們就需要返回了。

if(hang == n)
{result.push_back(chessboard);return ;
}

3、確定單層邏輯
如果本行的某列放入皇后,且不違反規則,即可進入下一行探索

 for(int lie = 0;lie < n ;lie++)
{if(juge_if_valid(hang,lie,chessboard,n) == true){chessboard[hang][lie] = 'Q';	//放置皇后backtracking(hang+1,chessboard,n);chessboard[hang][lie] = '.';	//回溯撤銷}}

4、判斷是否滿足分布條件有三個:

1、皇后不在同一行
2、皇后不在同一列
3、皇后不在同一斜線上

a、同時我們注意,我們探索的時候就是按照深度探索的,所以保證了每一行只有一次賦值Q。所以第一個條件不需要特別處理。
b、由于按照深度往下搜索,所以判斷皇后在同一列的時候可以剪枝:

//檢查本行之上的行的同一列是否存在Q
for(int i=0;i<hang;i++)
{if(chessboard[i][lie] == 'Q') return false;
}

c、由于按照深度往下探索,所以判斷皇后在同一斜線的時候可以剪枝(注意,斜線分為向右上斜和左上斜兩個方向)

//檢查本行之上的行的右斜線上是否有皇后
for(int i=hang-1,j=lie-1;i>=0 && j>=0;i--,j--)
{if(chessboard[i][j] == 'Q') return false;
}
//檢查本行之上的行的左斜線上是否有皇后
for(int i=hang-1,j=lie+1;i>=0 && j<n;i--,j++)
{if(chessboard[i][j] == 'Q') return false;
}

AC代碼

class Solution {
public:vector<vector<string>>result;bool juge_if_valid(int hang,int lie,vector<string>&chessboard,int n){//檢查本行之上的行的同一列是否存在Qfor(int i=0;i<hang;i++){if(chessboard[i][lie] == 'Q') return false;}//檢查本行之上的行的右斜線上是否有皇后for(int i=hang-1,j=lie-1;i>=0 && j>=0;i--,j--){if(chessboard[i][j] == 'Q') return false;}//檢查本行之上的行的左斜線上是否有皇后for(int i=hang-1,j=lie+1;i>=0 && j<n;i--,j++){if(chessboard[i][j] == 'Q') return false;}return true;} void backtracking(int hang,vector<string>& chessboard,int n){if(hang == n){result.push_back(chessboard);return ;}for(int lie = 0;lie < n ;lie++){if(juge_if_valid(hang,lie,chessboard,n) == true){chessboard[hang][lie] = 'Q';	//放置皇后backtracking(hang+1,chessboard,n);chessboard[hang][lie] = '.';	//回溯撤銷}}return ;}vector<vector<string>> solveNQueens(int n) {result.clear();//填充初始棋盤vector<string> chessboard(n,string(n,'.'));backtracking(0,chessboard,n);return result;}
};

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

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

相關文章

Django實戰(18):提交訂單

前面的內容已經基本上涵蓋了Django開發的主要方面&#xff0c;我們從需求和界面設計出發&#xff0c;創建模型和修改模型&#xff0c;并通過scaffold作為開發的起點&#xff1b;在scaffold的基礎上重新定制模板&#xff0c;并且通過Model類和Form類對用戶輸入的數據進行校驗。我…

No module named ‘tensorflow.examples‘解決方案

想從tensorflow中導入mnist手寫數字數據集&#xff0c;結果報錯 from tensorflow.examples.tutorials.mnist import input_data import tensorflow.compat.v1 as tf tf.disable_v2_behavior()my_mnist input_data.read_data_sets("MNIST_data_bak/", one_hotTrue)&…

julia example_使用Julia中的Example的sign()函數

julia exampleJulia| sign()函數 (Julia | sign() function) sign() function is a library function in Julia programming language, it returns the sign of the given value in the form of -1/1. sign()函數是Julia編程語言中的庫函數&#xff0c;它以-1 / 1的形式返回給…

.NET通用基本權限系統

DEMO下載地址&#xff1a; http://download.csdn.net/detail/shecixiong/5372895 一、開發技術&#xff1a;B/S(.NET C# ) 1、Windows XP以上 (支援最新Win 8) 2、Microsoft Visual Studio 2010/2012 C#.NET 3、.NET Framework 4.0以上 (支援最新4.5版本) 4、SQL Server 2005以…

leetcode 37. 解數獨 思考分析

目錄題目核心思路的不斷細化1、核心框架2、考慮到每個位置的工作3、考慮到到達最后一列、該位置的數已經預置的情況4、判斷是否符合規則的函數5、確定遞歸終止條件確定函數返回值AC代碼題目 編寫一個程序&#xff0c;通過填充空格來解決數獨問題。 一個數獨的解法需遵循如下規…

快速完成兼職外包開發任務

做了很多年的開發相關的工作&#xff0c;做過兼職開發&#xff0c;也做過外包一些開發項目。 兼職人員角色時 正是經歷這些事情時&#xff0c;每次就要提前很費經的跟公司溝通&#xff0c;讓他們把公司內部的svn開發出去&#xff0c;但是就是很難&#xff0c;會涉及到安全各方的…

使用YOLOv5訓練NEU-DET數據集

一、下載YOLOv5源碼和NEU-DET(鋼材表面缺陷)數據集 YOLOv5源碼 NEU-DET(鋼材表面缺陷)數據集 這里的數據集已經經過處理了&#xff0c;下載即可 若通過其他途徑下載的原始數據集標簽為xml格式&#xff0c;需要轉化為txt格式XML轉txt格式腳本 二、數據集準備 NEU-DET(鋼材表…

kotlin獲取屬性_Kotlin程序獲取系統MAC地址

kotlin獲取屬性The task is to get system MAC address. 任務是獲取系統MAC地址。 package com.includehelpimport java.net.InetAddressimport java.net.NetworkInterface//Function to get System MACfun getSystemMac(): String? {return try {val OSName System.getProp…

帶分頁功能的SSH整合,DAO層經典封裝

任何一個封裝講究的是&#xff0c;使用&#xff0c;多狀態。Action&#xff1a;任何一個Action繼承分頁有關參數類PageManage&#xff0c;自然考慮的到分頁效果&#xff0c;我們必須定義下幾個分頁的參數。并根據這個參數進行查值。然后在繼承ServiceManage&#xff0c;Service…

在windows phone Mango中使用原生代碼開發程序

本文不討論創建可執行的exe程序,主要想說明怎么在silverlight程序里面調用由原生代碼所編寫的DLL(C / ARM). 原生代碼可以調用更多的API,但是這并不是說你就能隨意獲得那些你沒有權限的資源,比如,你可以使用CopyFile這個API,但是如果你試圖把文件Copy到\Windows文件夾,就會得到…

leetcode 198. 打家劫舍 思考分析

目錄1、題目2、求解思路3、代碼1、題目 你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚上被小偷闖入&#xff0c;系統會自動…

找不到Windows照片查看器解決方法

桌面創建一個txt文本 復制這些命令&#xff0c;之后將后綴改為.reg&#xff0c;右擊管理員身份運行即可 Windows Registry Editor Version 5.00 ; Change Extensions File Type [HKEY_CURRENT_USER\Software\Classes\.jpg] "PhotoViewer.FileAssoc.Tiff" ; Change E…

數字拆分為斐波那契數列_檢查數字是否為斐波那契

數字拆分為斐波那契數列Description: 描述&#xff1a; We are often used to generate Fibonacci numbers. But in this article, we are going to learn about how to search Fibonacci numbers in an array? 我們經常被用來產生斐波那契數。 但是在本文中&#xff0c;我們…

伙伴分配器的一個極簡實現

提起buddy system相信很多人不會陌生&#xff0c;它是一種經典的內存分配算法&#xff0c;大名鼎鼎的Linux底層的內存管理用的就是它。這里不探討內核這么復雜實現&#xff0c;而僅僅是將該算法抽象提取出來&#xff0c;同時給出一份及其簡潔的源碼實現&#xff0c;以便定制擴展…

[USACO3.2.3 Spinning Wheels]

[關鍵字]&#xff1a;模擬 枚舉 [題目大意]&#xff1a;有5個輪子&#xff0c;每個輪子優r個缺口并且會按一定速度不停轉動&#xff0c;問什么時候可以使一條光線射過所有輪子。 // [分析]&#xff1a;從0到1000&#xff08;或其他的&#xff09;枚舉分鐘然后判斷&#xff0c;當…

一、SQLServer2008安裝(帶密碼)、創建數據庫、C#窗體項目測試

一、下載和安裝SQLServer2008 東西太大了&#xff0c;沒法上傳到資源里面&#xff0c;官網其他公眾號都下載可以。 右擊管理員身份 運行setup.exe 這個密鑰不能用的話&#xff0c;也可以去百度其他密鑰 JD8Y6-HQG69-P9H84-XDTPG-34MBB 建議改一下路徑&#xff0c;我這邊修…

python獲取當前日期_Python程序獲取當前日期

python獲取當前日期In the below example – we are implementing a python program to get the current date. 在下面的示例中-我們正在實現一個python程序來獲取當前日期 。 Steps: 腳步&#xff1a; Import the date class from datetime module. 從datetime模塊導入日期類…

【C++grammar】多態、聯編、虛函數

目錄1、多態概念1.多態性有兩種表現的方式2、聯編&#xff08;實現多態&#xff09;1.靜態聯編2.動態聯編3、實現運行時多態1.為何要使用運行時多態&#xff1f;2.如何實現運行時多態3.多態的例子1.調用哪個同名虛函數&#xff1f;2. 用途&#xff1a;可以用父類指針訪問子類對…

一 MVC - HtmlHelper

HtmlHelper類位于System.Web.Mvc.Html之中主要有七個靜態類組成&#xff1a; FormExtensions - BeginForm, BeginRouteForm, EndForm InputExtensions - CheckBox, CheckBoxFor, Hidden, HiddenFor, Password, PasswordFor, RadioButton, RadioButtonFor, TextBox, TextBoxFor …

HDOJ 400題紀念。

剛剛交了1506&#xff0c;無意間瞟到左邊的隨筆數&#xff0c;發現已經401題了&#xff0c;這么說前幾天就400題了啊囧。 昨天還想交到400題就先放放&#xff0c;背單詞的&#xff0c;沒想到那么快。等把USACO那個八皇后寫完吧。人生總是有許多不想做又不得不做的事情。。。 還…