Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1360 Accepted Submission(s): 679
7 1 2 3 4 5 6 7 8 1 2 3 5 8 13 21 34 0
1 2 3 4 5 6 1 2 3 4 5 7 1 2 3 4 6 7 1 2 3 5 6 7 1 2 4 5 6 7 1 3 4 5 6 7 2 3 4 5 6 7 1 2 3 5 8 13 1 2 3 5 8 21 1 2 3 5 8 34 1 2 3 5 13 21 1 2 3 5 13 34 1 2 3 5 21 34 1 2 3 8 13 21 1 2 3 8 13 34 1 2 3 8 21 34 1 2 3 13 21 34 1 2 5 8 13 21 1 2 5 8 13 34 1 2 5 8 21 34 1 2 5 13 21 34 1 2 8 13 21 34 1 3 5 8 13 21 1 3 5 8 13 34 1 3 5 8 21 34 1 3 5 13 21 34 1 3 8 13 21 34 1 5 8 13 21 34 2 3 5 8 13 21 2 3 5 8 13 34 2 3 5 8 21 34 2 3 5 13 21 34 2 3 8 13 21 34 2 5 8 13 21 34 3 5 8 13 21 34
解题思路:
用全排列的思想,做了半天没做出来,出了好多问题,比如数字重复,数字没递增,数字比上次输出的小等等。看了别人的结题报告才发现自己忽视了一个重要的问题,该题和全排列取六个数不同,它要求取出的六个数是递增的,所以在用dfs搜索的时候,不能只用一个参数,还要记录下次搜索的位置,即上个数的下一个。
代码:
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int num[14],k;
int p[7];
void dfs(int step,int cur)
{
if(step>6)
{
for(int i=1;i<=5;i++)
cout<<p[i]<<" ";cout<<p[6];
cout<<endl;
}
else
{
for(int i=cur;i<=k;i++)//注意这个i不是从第一个数开始,而是从以确定的数下一个开始。这是题意决定的。
{
p[step]=num[i];
dfs(step+1,i+1);//和全排列不同的地方,注意是i+1
}
}
}
int main()
{
int flag=0;
while(cin>>k&&k)
{
if(flag)
cout<<endl;
for(int i=1;i<=k;i++)
cin>>num[i];
dfs(1,1);//后面的参数保证搜索下一个数时不从数组中的第一个数开始,而是从以确定的数的下一个开始,保证了递增
flag=1;
}
return 0;
}
[ACM] hdu 1342 Lotto (排列),布布扣,bubuko.com
原文:http://blog.csdn.net/sr_19930829/article/details/21987743