poj2245 Lotto

poj2245 Lotto

http://poj.org/problem?id=2245

解题思路:本题为深度优先搜索基础题,没有很多的条件,只要从前到后,凑足6个数即可。


给出一个n,后面是n个用空格隔开的数字最后一组测试案例的n为0,不用处理最后一组数据。要求从前到后找出任意一组6个数,输出所有满足要求的数(组)。每组数占一行,两组测试案例的输出中间隔一个空行,最后一个测试案例的数据输出后不要输出空行。


简单深度优先搜索,只要搜到的,当前保存的数组中的数字有6个就输出。

(1)定义n用于记录当前测试数据的数据个数;定义一个数组num[],用于存储当前测试数据的操作数据(除n外);定义一个数组out[]用于存储挑选(搜索)出来的数。

(2)定义一个函数dfs(int i,int many) ,用于搜索目标输出数,i表示上次搜索到的数在存储操作数据数组中的位置的下一个位置,即这次搜索要开始的位置,保证搜到的数据是从前到后出现的;many表示当前输出数组中的已搜到的数据的个数,也是这次搜到数据存储在输出数组的位置的下标,当many等于6时,表示已经搜索到一组符合题意的数,当即输出,继续搜索。搜索结束时,所有满足要求的数的组合已经全部输出。否则,搜索逐个后面未搜索的所有数据。


12053720201140450072245Accepted116K0MSC++698B2013-08-29 22:43:18

#include<stdio.h>
#include<string.h>
int n,num[14],vist[14];
int out[8];
void dfs(int i,int many)
{
    if(many==6)  //一组数据搜索完成
    {
        printf("%d",out[0]);   //输出该组数据
        for(int j=1;j<6;j++)
        printf(" %d",out[j]);
        printf("\n");
        return ;
    }
    for(;i<n;i++)  //逐个搜索后面的数字
    { 
        if(!vist[i])  //若该数字(据)未处理过(在本次搜索中),则进行处理,否则,跳过
        {
            out[many]=num[i];
            vist[i]=1;
            dfs(i+1,many+1);
            vist[i]=0;
        }
    }
}
int main()
{
    int j=0;
    while(scanf("%d",&n)&&n)
    {
        if(j)printf("\n");   //两组测试数据的输出数据中间有空格
        for(int i=0;i<n;i++)scanf("%d",&num[i]);
        memset(vist,0,sizeof(vist));
        dfs(0,0);
        j=1;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值