题目大体意思是给你一些盒子的长宽高,把它们摞起来,怎样摆放每个盒子任意,但总要保证下面的比上面的大, 实际问题转变成问题模型有点困难的,利用深度优先搜索,
对每种情况进行遍历,找到能摞起来盒子数最多的情况。
标准是自上而下的搜索,要求是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;
}