您的位置:首页 > 其它

zoj 1089 lotto (DFS )

2011-11-15 00:56 267 查看
题意:



给出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: