#46087:


s290006@student.cysh.cy.edu.tw (讓世界知道風堇的好)

學校 : 國立嘉義高級中學
編號 : 263344
來源 : [36.239.12.118]
最後登入時間 :
2024-11-11 16:26:06
c074. 00441 - Lotto -- UVa441 | From: [36.239.25.157] | 發表日期 : 2025-05-20 22:05

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;

}

 

}

 

 

 

 

 
ZeroJudge Forum