USACO ORZ----HDU_4277----DFS+STL+枚举

本文介绍了解决HDU 4277问题的方法,该问题是计算给定不同长度的木棍能构成多少种不同的三角形。通过深度优先搜索(DFS)枚举所有组合,并使用STL set容器避免重复计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4277


/*
Author:Bob Lee
2012.9.15
==================================================
题目的意思是给你n个木棍,问你可以组成多少个不同的三角形
最多15根
解题思路就是DFS枚举
把所有可能的情况枚举出来
难点就是判重的问题,这里用到了STL中的set容器
对于每一种情况,边的大小按顺序排列
然后有一个公式得到一个具体的值
如果没有重复的话,就是一种情况,加入到set里面
这里要注意我们自己写把三个排列的代码
自己开始偷懒用sort,果断TLE了
看来STL还是很有用的。
*/

#include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;

#define MAXN 16

set<long long> myset;
int n;
int data[MAXN];
int m;
int sum;

void dfs(int num,int x1,int x2,int x3)
{
    if(num > n)
        return;
    if(x1+x2 > x3 && x2+x3 > x1 && x3+x1 > x2)
    {
        int a[3];
        a[0] = x1;
        a[1] = x2;
        a[2] = x3;
        if(a[0] > a[1])
            swap(a[0],a[1]);
        if(a[0] > a[2])
            swap(a[0],a[2]);
        if(a[1] > a[2])
            swap(a[1],a[2]);

        long long hash = a[0]+a[1]*sum+a[2]*sum*sum;
        if(myset.find(hash) == myset.end())
        {
            m++;
            myset.insert(hash);
        }
    }
    if(x3-data[num]+x2>x1+data[num])
        dfs(num+1,x1+data[num],x2,x3-data[num]);
    if(x3-data[num]+x1>x2+data[num])
        dfs(num+1,x1,x2+data[num],x3-data[num]);
    dfs(num+1,x1,x2,x3);
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        m=0;
        sum = 0;
        myset.clear();
        int i;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&data[i]);
            sum+=data[i];
        }
        dfs(1,0,0,sum);
        printf("%d\n",m);
    }
    return 0;
}



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值