uestc oj 1795 Babs' Box Boutique

 
 

题目大体意思是给你一些盒子的长宽高,把它们摞起来,怎样摆放每个盒子任意,但总要保证下面的比上面的大, 实际问题转变成问题模型有点困难的,利用深度优先搜索,

对每种情况进行遍历,找到能摞起来盒子数最多的情况。

标准是自上而下的搜索,要求是a,b,c从小到大排好序之后先从小的组合开始a,b;不行的话再a,c;;再不行就最大的组合b,c;因为要求数量最左,所以尽量小就行了。

这其实也是一种剪枝的,如果直接混乱组合  ,每个都进行搜索也可以解出来的,但是效率低的。

#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;   //定义max竟然是错的,要定义大写的Max
struct node
{
    int a;
    int b;
    int c;
} p[11];
int n;
int Max;
int visit[11];
void DFS(int ax,int ay,int t)
{
    if(t>Max)
     {
         Max = t;
     }
     for(int i=0; i<n; i++)
     {
         if(visit[i]==0)
         {
             if(p[i].a>=ax&&p[i].b>=ay)
             {
                 visit[i]=1;
                 DFS(p[i].a,p[i].b,t+1);
                 visit[i]=0;
             }
             else if(p[i].a>=ax&&p[i].c>=ay)
             {
                 visit[i]=1;
                 DFS(p[i].a,p[i].c,t+1);
                 visit[i]=0;
             }
             else if(p[i].b>=ax&&p[i].c>=ay)
             {
                 visit[i]=1;
                 DFS(p[i].b,p[i].c,t+1);
                 visit[i]=0;
             }
         }
     }
}
int main()
{
    int kk=1;
    while(scanf("%d",&n)!=EOF)//在这个地方如何进行判断竟然在时间上会有差别,这个是怎么回事呢
    {
        if(n==0) break;
        memset(visit,0,sizeof(visit));
        int t[4];
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<3;j++)
               scanf("%d",&t[j]);
            sort(t,t+3);
            p[i].a = t[0];
            p[i].b = t[1];
            p[i].c = t[2];
        }
        Max = 0;
        DFS(0,0,0);
        printf("Case %d: %d\n",kk,Max);
        kk++;
    }
    return 0;
}





你可能感兴趣的:(数据结构--搜索)