日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dfs中return回溯问题

發布時間:2023/12/4 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dfs中return回溯问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:
從1到n中選k個數進行排列

首先我們看這段代碼:

#include <iostream> using namespace std; int n, k; const int N = 1010; int a[N]; bool st[N];void dfs(int u) {if (u == k + 1) {for (int i = 1; i <= k; i++) {cout << a[i] << " ";}cout << endl;return ;}for (int i = 1; i <= n; i++) {if (!st[i]) {st[i] = true;a[u] = i;dfs(u + 1);st[i] = false;}} }int main() {cin >> n >> k;dfs(1);return 0; }

這段代碼,把return去掉是不會有任何問題的,現在我們來看下面這段代碼:

#include <iostream> using namespace std; int n, k; const int N = 1010; int a[N]; bool st[N];void dfs(int u) {if (u > k + 1) {for (int i = 1; i <= k; i++) {cout << a[i] << " ";}cout << endl;return ;}for (int i = 1; i <= n; i++) {if (!st[i]) {st[i] = true;a[u] = i;dfs(u + 1);st[i] = false;}} }int main() {cin >> n >> k;dfs(1);return 0; }

這段代碼如果我們把return去掉,就會出現結果不對的問題,原因是什么呢???
是終止條件的不同。

第一個代碼的條件是u==k+1,而第二個代碼的條件是u >k+1,那么當我們都把return 去掉時,第二個代碼中的

for (int i = 1; i <= n; i++) {if (!st[i]) {st[i] = true;a[u] = i;dfs(u + 1);st[i] = false;}

此時繼續dfs,那么u繼續+1,舉個例子,本來u=2,k = 1,u已經比k大了,輸出一次結果,此時你不回溯,那么for循環繼續,u+1,u = 3,u還是比k大,那么又會重新打印剛剛的結果,可是第一種情況,因為你的判斷條件是u==k+1,u = 2,k = 1,符合條件,此時如果不回溯,u+1,u = 3,u!=k+1,就不會重新打印結果,所以最后答案是一樣的,但是事實上dfs的次數變多了。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的dfs中return回溯问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。