zoj 1089 lotto (DFS )

题意:

 

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值