题意:
给出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; }