您的位置:首页 > 其它

UVA 10051 Tower of Cubes

2016-04-15 17:22 537 查看
【题意】给了n个立方体,并且给了每个面的颜色!并且给的顺序是按照质量由轻到重,这保证了我们的堆叠肯定是从上往下,且质量递增的。所以我们只需要保证下一个立方体的顶的颜色和上一个的底层相同就可以了。因此这是一个简单DAG上的最长路径问题!实际也可以用最长上升子序列的做法!

【AC代码】

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
const char temp[6][10] = {"front","back","left","right","top","bottom"};
struct node
{
int c[6];
} aa[502];
struct Node
{
int num,color;
} box[502],save[502];
int answer,n;
int dp[502][502];
void dfs(int id,int bottom,int num)
{
for(int i=id+1; i<=n; i++)
{
for(int j=0; j<6; j++)
{
if(id==0||(aa[i].c[j]==bottom&&dp[i][j]<num+1))
{
dp[i][j] = num+1;
if(j%2==1)
{
box[num].num = i;
box[num].color = j;
dfs(i,aa[i].c[j-1],num+1);
}
else
{
box[num].num = i;
box[num].color = j;
dfs(i,aa[i].c[j+1],num+1);
}
}
}
}
if(answer<num)
{
answer = num;
for(int i=0; i<num; i++)
{
save[i] = box[i];
}
}
}
int main()
{
int cas=1;
while(scanf("%d",&n)&&n)
{
for(int i=1; i<=n; i++)
{
for(int j=0; j<6; j++)
{
scanf("%d",&aa[i].c[j]);
}
}
memset(dp,0,sizeof(dp));
answer = 0;
dfs(0,0,0);
printf("Case #%d\n",cas++);
printf("%d\n",answer);
for(int i=0; i<answer; i++)
{
printf("%d %s\n",save[i].num,temp[save[i].color]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: