1.小心句尾空格,這題是嚴格比對
2.用dfs
基本邏輯:設有k個數字,把每個數字丟到vector path,索引值0~k-1。
初始dfs(i),i可為0~k-6(最後一項是k-6,k-5,k-4,k-3,k-2,k-1)
這裡我用void dfs(int index)
每次丟dfs進行以下步驟:
(一)將index對應的數字丟入path.push_back()
(二)判斷:若nums==6,cout全部,然後把該數字清除(path.pop_back),nums--(減回來),最後return
(三)若沒有return,再開一個for迴圈,i設為index+1~k+1-(n-nums),跑後面所有數字的dfs
//n=6 共有六個幸運數字,n-nums是還剩下的幸運數字空位,至於那個+1,我是瞎跑跑成功的,懶得想了,總之這樣是對的(??
(四)跑完for後清除(path.pop_back),別忘了nums--,最後return
每次遞迴用變數nums紀錄總共幾個數字,如果nums==6就是湊滿六個幸運數字了
程式碼如下,方便參照:
-
-
-
-
-
-
-
#include <iostream>
#include <vector>
using namespace std;
const int n=6;
vector<int> path;
int nums=0,k,s[25]={0};
void dfs(int index){
nums++;
path.push_back(s[index]);
if(nums==n){ //若達到上限數量
for(int i=0;i<path.size();i++){
cout<<path[i];
if(i!=path.size()-1) cout<<' ';
}
cout<<endl;
path.pop_back();//消除
nums--;
return;
}
//若未達到
for(int i=index+1;i<=k-(n-nums);i++){
dfs(i);
}
path.pop_back();//消除
nums--;
return;
}
int main() {
bool b=false;
while(cin>>k&&k!=0){
if(b) cout<<'\n';
for(int i=0;i<k;i++){
cin>>s[i];
}
for(int i=0;i<k;i++){
dfs(i);
}
b=true;
}
}