国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

N皇后問題詳解:回溯算法的應(yīng)用與實(shí)踐(dfs)

這篇具有很好參考價(jià)值的文章主要介紹了N皇后問題詳解:回溯算法的應(yīng)用與實(shí)踐(dfs)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

N皇后問題詳解:回溯算法的應(yīng)用與實(shí)踐(dfs),算法入門,深度優(yōu)先,算法,圖搜索算法

一.問題描述

N皇后問題詳解:回溯算法的應(yīng)用與實(shí)踐(dfs),算法入門,深度優(yōu)先,算法,圖搜索算法
題目如上圖所示,在一個(gè)n*n的國際象棋棋盤上怎么擺放能使得皇后互相攻擊不到(也就是在任意一列、一行、一條對角線上都不存在兩個(gè)皇后

二.思路分析

1.DFS

想要解決這個(gè)問題,我們可以使用dfs也就是深度優(yōu)先遍歷,深度優(yōu)先搜索的步驟為先遞歸到底再回溯上來,顧名思義,dfs是以深度為目標(biāo),一條路走到底,直到達(dá)到無路可走時(shí),退回到上一步的狀態(tài),走其他路回溯上來。
這題我們就可以定義數(shù)組當(dāng)做棋盤,遍歷所有位置判斷是否可以放置皇后(需要滿足任意一列、一行、一條對角線上都不存在兩個(gè)皇后),在遍歷的過程中需要考慮剪枝的情況,減少解題時(shí)間復(fù)雜度。

三.代碼實(shí)現(xiàn)與解析

1.分析

首先我們創(chuàng)建完數(shù)組模擬棋盤后,先要依據(jù)題意,將數(shù)組初始化為.

#include <iostream>
const int N = 20;
using namespace std;
char ret[N][N];

bool col[N], dg[N], udg[N];//標(biāo)記列、對角線上是否已經(jīng)有皇后

int n = 0;

void dfs(int u);

int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int m = 0; m < n; m++)
			ret[i][m] = '.';

	dfs(0);//dfs算法函數(shù)
	return 0;
}

緊接著就是dfs函數(shù)代碼的實(shí)現(xiàn)邏輯:

void dfs(int u)
{
	if (u == n)
	{
		for (int i = 0; i < n; i++)
		{
			cout << ret[i] << endl;;
		}
		cout<< endl;
		return;
	}

	for (int i = 0; i < n; i++)
	{
		if (!col[i] && !dg[u + i] && !udg[n + i - u])
		{
			ret[u][i] = 'Q';
			col[i] = dg[u + i] = udg[n + i - u] = true;
			dfs(u + 1);
			ret[u][i] = '.';
			col[i] = dg[u + i] = udg[n + i - u] = false;
		}
	}
}

需要重點(diǎn)理解的在for循環(huán)中i代表的是列數(shù)(遍歷的是列),u代表的是層數(shù),if判斷當(dāng)行、對角線均暫無皇后時(shí),則可以在此放置皇后,并標(biāo)識(shí)為已經(jīng)放置,此時(shí)這一層的放置就結(jié)束了,所以接著就要遞歸下一層,之后就會(huì)分為兩種情況:
1.遞歸到最后一層成功打印了這次的方案。接著就會(huì)向上回溯

ret[u][i] = '.';
col[i] = dg[u + i] = udg[n + i - u] = false;

執(zhí)行恢復(fù)邏輯。
2.在后續(xù)層數(shù)遍歷放置時(shí),出現(xiàn)了不合法的情況(列數(shù)到達(dá)閾值依舊沒有放置),此時(shí)就會(huì)剪枝,也是會(huì)回溯到上圖代碼進(jìn)行恢復(fù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-843481.html

2.完整代碼

#include <iostream>
const int N = 20;
using namespace std;
char ret[N][N];

bool col[N], dg[N], udg[N];

int n = 0;

void dfs(int u);

int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int m = 0; m < n; m++)
			ret[i][m] = '.';

	dfs(0);
	return 0;
}
void dfs(int u)
{
	if (u == n)
	{
		for (int i = 0; i < n; i++)
		{
			cout << ret[i] << endl;;
		}
		cout<< endl;
		return;
	}

	for (int i = 0; i < n; i++)
	{
		if (!col[i] && !dg[u + i] && !udg[n + i - u])
		{
			ret[u][i] = 'Q';
			col[i] = dg[u + i] = udg[n + i - u] = true;
			dfs(u + 1);
			ret[u][i] = '.';
			col[i] = dg[u + i] = udg[n + i - u] = false;
		}
	}
}

到了這里,關(guān)于N皇后問題詳解:回溯算法的應(yīng)用與實(shí)踐(dfs)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • python中級篇1:n皇后問題(回溯算法)

    hello!大家好,我是浪矢秀一。最近經(jīng)歷了許多事情,終于是恢復(fù)1次更新了。那么今天呢,我們來學(xué)習(xí)中級篇,需要學(xué)過不少python知識(shí)的人來學(xué)習(xí)。好了,廢話不多說,我們進(jìn)入今天的課程! ? 在1個(gè)n*n的國際象棋棋盤上,放置n個(gè)皇后,要求:同1行、同1列、同1斜線上只能有1個(gè)皇后。 ? 既然

    2024年02月03日
    瀏覽(24)
  • 八皇后問題,秒懂遞歸回溯(有圖詳解|c語言)

    八皇后問題,秒懂遞歸回溯(有圖詳解|c語言)

    目錄 ????前言 ????題目介紹 ????引入: ????解決思路: ????理論存在,實(shí)踐開始! ????難點(diǎn)1:如何表示對角線被占領(lǐng)? ????難點(diǎn)2:如何用遞歸的方法來放皇后? ????難點(diǎn)3:如何實(shí)現(xiàn)回溯? ????難點(diǎn)4:如何實(shí)現(xiàn)皇后位置的輸出? ????全部代碼如下: ??

    2024年02月02日
    瀏覽(23)
  • 【算法】遞歸、回溯、剪枝、dfs 算法題練習(xí)(組合、排列、總和問題;C++)

    【算法】遞歸、回溯、剪枝、dfs 算法題練習(xí)(組合、排列、總和問題;C++)

    后面的練習(xí)是接著下面鏈接中的文章所繼續(xù)的,在對后面的題練習(xí)之前,可以先將下面的的文章進(jìn)行了解??: 【算法】{畫決策樹 + dfs + 遞歸 + 回溯 + 剪枝} 解決排列、子集問題(C++) 思路 題意分析 :要求根據(jù)給出的數(shù)字,算出合法的括號(hào)組成個(gè)數(shù)。根據(jù)題目,我們可以總

    2024年02月22日
    瀏覽(23)
  • 動(dòng)態(tài)規(guī)劃、DFS 和回溯算法:二叉樹問題的三種視角

    在計(jì)算機(jī)科學(xué)中,算法是解決問題的核心。特別是對于復(fù)雜的問題,不同的算法可以提供不同的解決方案。在本篇博客中,我們將探討三種算法:動(dòng)態(tài)規(guī)劃、深度優(yōu)先搜索(DFS)和回溯算法,它們?nèi)绾螐牟煌慕嵌冉鉀Q以二叉樹為基礎(chǔ)的問題。 二叉樹是一種非?;A(chǔ)的數(shù)據(jù)結(jié)

    2024年02月04日
    瀏覽(19)
  • DFS(深度優(yōu)先遍歷、N皇后問題、2N皇后問題)

    DFS(深度優(yōu)先遍歷、N皇后問題、2N皇后問題)

    目錄 一、回溯法與深度優(yōu)先搜索(DFS) 二、DFS與二叉樹的前序遍歷 2.1、二叉樹的前序遍歷 2.2、DFS 全排列 ?2.3、分析 三、N皇后問題 1. 回溯法: 是一種通過探索所有可能的候選解來找出所有解的算法。如果候選解被確認(rèn)不是一個(gè)解的話(或者至少不是最后一個(gè)解),回溯法

    2024年03月21日
    瀏覽(25)
  • 八皇后問題(回溯法)

    八皇后問題(回溯法)

    目錄 什么是八皇后 八皇后問題怎么解決? 什么是回溯法 回溯法的模板 八皇后問題的核心代碼 判斷皇后位置是否可行 總體實(shí)現(xiàn)代碼 每日一句: 種一棵樹的最好時(shí)間是十年前,其次是現(xiàn)在。 八皇后問題(英文:Eight queens),是由國際西洋棋棋手馬克斯·貝瑟爾于1848年提出的

    2023年04月09日
    瀏覽(19)
  • 回溯法求解八皇后問題

    回溯法求解八皇后問題

    問題提出 :八皇后問題是一個(gè)古老而著名的問題。該問題是十九世紀(jì)著名的數(shù)學(xué)家高斯1850 提出在 8x8 格的國際象棋上擺放八皇后,使其不能互相攻擊,即任意兩個(gè)皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。高斯認(rèn)為有76種方案。1854年在柏林的象棋雜志

    2023年04月08日
    瀏覽(22)
  • 回溯法--n皇后問題

    回溯法--n皇后問題

    回溯法有兩個(gè)模板--子集樹、排列樹,他們有回溯法的共同特點(diǎn):深度優(yōu)先搜索,如果一條路走不通,再退回來(類似遞歸) 八皇后問題最早是由國際象棋棋手馬克斯·貝瑟爾(Max Bezzel)于1848年提出。第一個(gè)解在1850年由弗朗茲·諾克(Franz Nauck)給出。并且將其推廣為更一般

    2024年02月02日
    瀏覽(20)
  • 3.2 回溯法—N皇后問題

    3.2 回溯法—N皇后問題

    1. 問題描述 在 n × n ntimes n n × n 的棋盤上擺放 n n n 個(gè)皇后,使任意兩個(gè)皇后都不能處于同一行、同一列或同一斜線上 2. 問題分析 下以求解4皇后問題為例,分析4皇后問題的排列樹以及回溯過程: 搜索及回溯過程: 解空間樹: 3. 算法設(shè)計(jì) 1. 算法思想 ①用數(shù)組x[]存放皇后的

    2024年02月04日
    瀏覽(16)
  • N皇后問題(DFS解決)

    N皇后問題(DFS解決)

    先贊后看,養(yǎng)成習(xí)慣?。。 _ ^3 ?? ?? ?? 碼字不易,大家的支持就是我堅(jiān)持下去的動(dòng)力。點(diǎn)贊后不要忘了 關(guān)注 我哦! 題目鏈接

    2024年04月28日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包