题意:
给出k个数,要求在这k个数中选取6个数进行递增排列,列出所有情况。
分析:
全排列问题,简单的dfs,要搞清楚的有一点:要取值的第i个数的取值范围。
比如
7 1 2 3 4 5 67
那么第1个数可以在1和2之间选择。
第二个数可以在2,3,之间选择……
因为k很小而且也只需要6个数,所以直接暴力也是可以的,将暴力进行到底啊。
至于dfs,之前想太多要设置标记数组,实际都不必要。
简单的在dfs里加个循环搜索有点像zoj1457,但规模还要小。
//方法1:在poj的discuss里看到的暴强代码:6层循环
#include<stdio.h>//全排列,层循环,强大啊,因为k比较小。太NB了
#include <string.h>
int main()
{
int i,a1,a2,a3,a4,a5,a6,k;
int a[14];
scanf("%d",&k);
while(1)
{
if(k==0) break;
for(i=0;i<k;i++) scanf("%d",&a[i]);
for(a1=0;a1<k-5;a1++)
for(a2=a1+1;a2<k-4;a2++)
for(a3=a2+1;a3<k-3;a3++)
for(a4=a3+1;a4<k-2;a4++)
for(a5=a4+1;a5<k-1;a5++)
for(a6=a5+1;a6<k;a6++)
printf("%d %d %d %d %d %d\n",a[a1],a[a2],a[a3],a[a4],a[a5],a[a6]);
scanf("%d",&k);
if(k)
printf("\n");
}
return 0;
}
//方法2:一般做法,dfs
#include <stdio.h>
int k,a[14],b[7];
void dfs(int len,int current)
{
int i;
if(len>6)
{
for(i=1;i<6;i++)
{
printf("%d ",b[i]);
}
printf("%d\n",b[i]);
}
else
{
for(i=current;i<k-(6-len)+1;i++)//这里的循环,确定i的范围并赋值
{
b[len]=a[i];
dfs(len+1,i+1);
}
}
}
int main()
{
int i;
scanf("%d",&k);
while(1)
{
if(k==0) break;
for(i=1;i<=k;i++)
scanf("%d",&a[i]);
dfs(1,1);
scanf("%d",&k);
if(k) printf("\n");
}
return 0;
}