遞迴的精髓很難理解,一旦理解,演算法之路就會輕鬆很多
下面記錄一下遞迴的一種——全排列問題
通常的全排列問題一般是通過交換函式實現的,但是之後學習中,發現dfs也可以實現全排列因為dfs的本質就是遞迴,還有一種十分簡單的**,一般在做全排列的題目都是用的這種方法——它就是stl內建的全排列函式next_permutation,如果後面還有比它大的排列,那麼它就會返回true,如果沒有了,那就返回false;
初始碰到的就是這種交換函式,也是這種交換函式理解起來非常的難,這也就是為什麼一旦掌握遞迴的精髓就能更好更快的理解其他的演算法,因為後序有一部分演算法的核心**就是用遞迴實現的
下面這段**就是交換函式實現全排列的核心**,也是最難理解的**
void
dfs(
int now)
for(
int i = now; i <=9;
++i)
}
題目描述
用1, 2, 3…9 這九個數字組成乙個數學公式,滿足:abc + def = ghi,每個數字只能出現一次,編寫程式輸出所有的組合。
輸入
無輸出
輸出所有的 abc + def = ghi,
每行一條資料,格式為abc+def=ghi
輸出結果按照abc公升序排列,如果abc相同,則按照def公升序排列。
ac**
#include
#define ll long long
using
namespace std;
const
int maxn =
1e5+5;
const
int inf =
0x3f3f3f3f
;int g[maxn]
;struct node
} w[maxn]
;int cnt =0;
void
dfs(
int now)
return;}
for(
int i = now; i <=9;
++i)
}int
main()
函式next_permutation()是按照字典序產生排列的,並且是從陣列中當前的字典序開始依次增大直至到最大字典序
next_permutation()會取得[first,last)所標示之序列的下乙個排列組合,如果沒有下乙個排列組合,便返回false;否則返回true。
在不字串的情況下
next_permutation
(str.
begin()
,str.
end())
;
在知道陣列的情況下
next_permutation
(a,a+n)
;
ac**
#include
#define ll long long
using
namespace std;
const
int maxn =
1e5+5;
const
int inf =
0x3f3f3f3f
;int g[maxn]
;struct node
} w[maxn]
;int cnt =0;
intmain()
}while
(next_permutation
(g +
1, g +10)
);sort
(w +
1, w + cnt +1)
;for
(int i =
1; i <= cnt;
++i)
printf
("%d+%d=%d\n"
, w[i]
.a, w[i]
.b, w[i]
.c);
return0;
}
dfs與馬的遍歷思路有點類似,可以參考我的另一篇部落格快速理解dfs演算法——傳送門
#include
#define ll long long
using
namespace std;
const
int maxn =
1e5+5;
const
int inf =
0x3f3f3f3f
;int g[maxn]
, vis[maxn]
;struct node
} w[maxn]
;int cnt =0;
void
dfs(
int now,
int v)
return;}
for(
int i =
1; i <=9;
++i)}}
intmain()
總有乙個人,會把你的百鍊成鋼化為繞指柔,教會你溫柔對待這個世界 dfs全排列問題
全排列問題,不是計算全排列a,是把全排列列印出來,這也是dfs的一道入門題目,值得學習。問題 a 遞迴入門 全排列 題目描述 排列與組合是常用的數學方法。先給乙個正整數 1 n 10 例如n 3,所有組合,並且按字典序輸出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 輸入...
DFS全排列問題
題目描述 今天,桐桐的老師布置了一道數學作業,要求列出所有從數字1到數字n的連續自然數的排列,要求所產生的任一數字序列中不允許出現重複的數字。因為排列數很多,桐桐害怕寫漏了,所以她決定用計算機程式設計來解決。輸入只有乙個整數n 1 n 9 輸出按字典序輸出由1 n組成的所有不重複的數字序列,每行乙個...
dfs解決全排列問題
給定乙個n 0該問題相當於找出從某點到目的點的所有路徑問題,於是想到用dfs深度優先演算法,找到一條路徑即可直接輸出,直到找到所有的路徑。思路大致是,先放置乙個數,然後在沒有放置過的數字當中選擇乙個放在下乙個位置,依次進行,那我們發現,其實在選擇放置下乙個數字時,和解決之前的問題是一樣的 還是要在沒...