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

3.2 回溯法—N皇后問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了3.2 回溯法—N皇后問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 問(wèn)題描述

n × n n\times n n×n的棋盤上擺放 n n n個(gè)皇后,使任意兩個(gè)皇后都不能處于同一行、同一列或同一斜線上

2. 問(wèn)題分析

3.2 回溯法—N皇后問(wèn)題
下以求解4皇后問(wèn)題為例,分析4皇后問(wèn)題的排列樹以及回溯過(guò)程:
3.2 回溯法—N皇后問(wèn)題
搜索及回溯過(guò)程:
3.2 回溯法—N皇后問(wèn)題

解空間樹:
3.2 回溯法—N皇后問(wèn)題

3. 算法設(shè)計(jì)
1. 算法思想

①用數(shù)組x[]存放皇后的位置,x[k]表示第k個(gè)皇后放置的位置
②先在第一行放置第1個(gè)皇后,然后依2、3、…、n的次序放置其他皇后,當(dāng)?shù)趎個(gè)皇后放置好后產(chǎn)生一個(gè)可行解(為得到所有解,還需要繼續(xù)試探第n個(gè)皇后的下一個(gè)位置)
③試探每個(gè)皇后的位置都是從第1列開始的
④當(dāng)?shù)趉個(gè)皇后試探了所有列都不能放置時(shí),則回溯到第k-1個(gè)皇后,試探第k-1個(gè)皇后的下一個(gè)位置:如果第k-1個(gè)皇后的列號(hào)x[k-1]<n,則將其移到下一列,繼續(xù)試探;否則,再回溯到第k-2個(gè)皇后,依次類推
⑤放置第k個(gè)皇后應(yīng)與前面已經(jīng)放置的k-1個(gè)皇后不發(fā)生沖突
⑥若第1個(gè)皇后的所有位置回溯完畢,則算法結(jié)束

2. 代碼實(shí)現(xiàn)
#include<stdio.h>
#include<math.h>
#include<string>
//考察皇后k放置在x[k]列是否發(fā)生沖突
int Place(int k, int x[]) {											
	for (int i = 1; i < k; i++)
		/* 
           x[k] == x[i]:是否在同列
           Math.abs(k - i) == Math.abs(x[k] - x[i]):是否在同一斜線
         */
		if (x[k] == x[i] || fabs(k - i) == fabs(x[k] - x[i]))
			return 1;										//沖突則返回1
	return 0;
}
/*
	求解n皇后問(wèn)題
*/
//非遞歸算法
void Queens(int n, int x[]) {							
	int i = 1;												//i表示當(dāng)前行,也表示放置第i個(gè)皇后
	x[i] = 0;												//x[i]是當(dāng)前列,每個(gè)新考慮的皇后初始位置置為0列
	while (i >= 1) {										//尚未回溯到頭,循環(huán)
		x[i]++;												//原位置后移動(dòng)一列
		while (x[i] <= n && Place(i, x) == 1)				//發(fā)生沖突,試探下一個(gè)位置(i, x[i])
			x[i]++;
		if (x[i] <= n) {									//為第i個(gè)皇后找到了一個(gè)合適位置(i, x[i])
			if (i == n) {									//若放置了所有皇后,輸出一個(gè)解
				for (int k = 1; k <= n; k++)
					printf("%d ", x[k]);
				printf("\n");
			}
			else {											//若皇后沒(méi)有放置完
				i++;										//轉(zhuǎn)向下一行,即開始下一個(gè)新皇后的放置
				x[i] = 0;									//每個(gè)新考慮的皇后初始位置置為0列
			}
		}
		else i--;											//若第i個(gè)皇后找不到合適的位置,則回溯到上一個(gè)皇后
	}
}

//遞歸算法
void Queens(int i, int x[]int n){
if(i > n){
	for (int k = 1; k <= n; k++)							//n個(gè)皇后都放置好,輸出
		printf("%d ", x[k]);
	printf("\n");
}else
	for(int j = 1; j <= n; j++){							//每層均有n種放法
		x[i] = j;											//放置皇后t在第i列即x[t]
		if(Place(i, x) == 0)								//不沖突,考察皇后t放置在x[t]列是否發(fā)生沖突
			Queens(i+1, x, n);								//繼續(xù)遞歸放置下一個(gè)皇后
	}		
}

void main() {
	int n;
	printf("請(qǐng)輸入皇后個(gè)數(shù):");
	scanf_s("%d", &n);
	int *x = (int *)malloc(sizeof(int)*(n+1));
	//非遞歸調(diào)用
	Queens(n, x);
	//遞歸調(diào)用
	//Queens(1, x, n);
}
4. 復(fù)雜度分析

該算法中每個(gè)皇后都要試探n列,共n個(gè)皇后,其解空間是一棵子集樹,每個(gè)結(jié)點(diǎn)可能有n棵子樹,對(duì)應(yīng)的算法時(shí)間復(fù)雜度為 O ( n n ) O(n^n) O(nn)
利用顯示約束排除兩個(gè)皇后在同一行或同一列的方法,解空間樹就是一棵排列樹,因此共有 n ! n! n!個(gè)葉子結(jié)點(diǎn),所以算法的時(shí)間復(fù)雜度可以降為 O ( n ! ) O(n!) O(n!)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-441916.html

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

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

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

相關(guān)文章

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

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

    2024年02月03日
    瀏覽(24)
  • 算法:回溯算法(以解決n皇后問(wèn)題為例)

    算法:回溯算法(以解決n皇后問(wèn)題為例)

    基本思想:回溯算法的基本思想是:從一條路往前走,能進(jìn)則進(jìn),不能進(jìn)則退回來(lái),換一條路再試。八皇后問(wèn)題就是回溯算法的典型,第一步按照順序放一個(gè)皇后,然后第二步符合要求放第2個(gè)皇后,如果沒(méi)有位置符合要求,那么就要改變第一個(gè)皇后的位置,重新放第2個(gè)皇后

    2024年02月05日
    瀏覽(17)
  • 算法與數(shù)據(jù)結(jié)構(gòu)——遞歸算法+回溯算法——八皇后問(wèn)題

    算法與數(shù)據(jù)結(jié)構(gòu)——遞歸算法+回溯算法——八皇后問(wèn)題

    八皇后問(wèn)題是一個(gè)經(jīng)典的回溯算法問(wèn)題,目的是在8×8的國(guó)際象棋棋盤上放置八個(gè)皇后,使得沒(méi)有皇后可以互相攻擊(即沒(méi)有兩個(gè)皇后在同一行、同一列或同一對(duì)角線上)。 回溯算法是一種解決問(wèn)題的算法,它通過(guò)嘗試所有可能的解決方案來(lái)解決問(wèn)題。在八皇后問(wèn)題中,計(jì)算

    2024年02月09日
    瀏覽(21)
  • N皇后問(wèn)題詳解:回溯算法的應(yīng)用與實(shí)踐(dfs)

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

    題目如上圖所示,在一個(gè) n*n 的國(guó)際象棋棋盤上怎么擺放能使得皇后互相攻擊不到(也就是在 任意一列、一行、一條對(duì)角線上都不存在兩個(gè)皇后 ) 1.DFS 想要解決這個(gè)問(wèn)題,我們可以使用dfs也就是 深度優(yōu)先遍歷 ,深度優(yōu)先搜索的步驟為先遞歸到底再回溯上來(lái),顧名思義,df

    2024年03月26日
    瀏覽(26)
  • 八皇后問(wèn)題,秒懂遞歸回溯(有圖詳解|c語(yǔ)言)

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

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

    2024年02月02日
    瀏覽(23)
  • 【力扣 51】N 皇后(回溯+剪枝+深度優(yōu)先搜索)

    【力扣 51】N 皇后(回溯+剪枝+深度優(yōu)先搜索)

    按照國(guó)際象棋的規(guī)則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。 n 皇后問(wèn)題 研究的是如何將 n 個(gè)皇后放置在 n×n 的棋盤上,并且使皇后彼此之間不能相互攻擊。 給你一個(gè)整數(shù) n ,返回所有不同的 n 皇后問(wèn)題 的解決方案。 每一種解法包含一個(gè)不同的 n 皇后

    2024年02月22日
    瀏覽(22)
  • 【算法】回溯:與遞歸,dfs的同質(zhì)與分別,剪枝與恢復(fù)現(xiàn)場(chǎng)的詳細(xì)理解,n皇后的回溯解法及算法復(fù)雜度分析。

    【算法】回溯:與遞歸,dfs的同質(zhì)與分別,剪枝與恢復(fù)現(xiàn)場(chǎng)的詳細(xì)理解,n皇后的回溯解法及算法復(fù)雜度分析。

    目錄 ?編輯 1.什么是回溯 2.關(guān)于剪枝 3.關(guān)于恢復(fù)現(xiàn)場(chǎng) 4.題目:二叉樹的所有路徑(凸顯恢復(fù)現(xiàn)場(chǎng):切實(shí)感受回溯與深搜) 問(wèn)題分析 ①函數(shù)設(shè)置為:void Dfs(root) ②函數(shù)設(shè)置為:void Dfs(root,path) 解題思想:使?深度優(yōu)先遍歷(DFS)求解。 代碼實(shí)現(xiàn) 5.N后問(wèn)題 問(wèn)題分析 4皇后的放置

    2024年04月16日
    瀏覽(20)
  • Day31 46全排列 47全排列II 回溯去重tips 51N皇后 37解數(shù)獨(dú)

    Day31 46全排列 47全排列II 回溯去重tips 51N皇后 37解數(shù)獨(dú)

    給定一個(gè) 沒(méi)有重復(fù) 數(shù)字的序列,返回其所有可能的全排列。 示例: 輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] ?排列問(wèn)題與組合問(wèn)題的不同之處就在于,沒(méi)有startIndex,同時(shí)需要設(shè)置一個(gè)used數(shù)組,遍歷過(guò)的就設(shè)置成true,下次遇到時(shí)跳過(guò)。 給定一個(gè)可包含重

    2024年01月20日
    瀏覽(22)
  • C#八皇后算法:回溯法 vs 列優(yōu)先法 vs 行優(yōu)先法 vs 對(duì)角線優(yōu)先法

    目錄 1.八皇后算法(Eight Queens Puzzle) 2.常見的八皇后算法解決方案 (1)列優(yōu)先法(Column-First Method): (2)行優(yōu)先法(Row-First Method): (3)對(duì)角線優(yōu)先法(Diagonal-First Method): (4)回溯法(Backtracking): ???????皇后問(wèn)題是一個(gè)古老而著名的問(wèn)題,它實(shí)質(zhì)上就是使棋

    2024年03月22日
    瀏覽(15)
  • 第3章-指標(biāo)體系與數(shù)據(jù)可視化-3.2-描述性統(tǒng)計(jì)分析與繪圖

    目錄 變量的度量類型 變量的分布類型 正態(tài)分布 對(duì)數(shù)正態(tài)分布? 伽馬分布

    2024年02月07日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包