博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 10051 Tower of Cubes(DAG最长路)
阅读量:4588 次
发布时间:2019-06-09

本文共 1903 字,大约阅读时间需要 6 分钟。

题目大意:有n个正方体,从序号1~n, 对应的每个立方体的6个面分别有它的颜色(用数字给出),现在想要将立方体堆成塔,并且上面的立方体的序号要小于下面立方体的序号,相邻的面颜色必须相同。输出最高值和路径。

解题思路:因为立方体可以旋转,所以一个序号的立方体对应这6种不同的摆放方式,可以将问题理解成DAG最长路问题, 只是搜索范围是从i + 1开始到n。然后记录路径要开两个2维数组。

路径不唯一,随便输出一条。

 

#include 
#include
const int N = 1005;const int M = 10;const char sign[M][10]= {"front", "back", "left", "right", "top", "bottom"};struct state { int in; int out;}tmp[N][M];int n, x[N][M], y[N][M], dp[N][M];void Init() { memset(tmp, 0, sizeof(tmp)); memset(dp, 0, sizeof(dp)); memset(x, 0, sizeof(x)); memset(y, 0, sizeof(y));}void write(int k, int a, int b, int d) { tmp[d][k].in = a; tmp[d][k].out = b;}void read() { int a, b; for (int i = 1; i <= n; i++) { for (int j = 0; j < 3; j++) { scanf("%d%d", &a, &b); write(j * 2, a, b, i); write(j * 2 + 1, b, a, i); } }}int search(int d, int k) { if (dp[d][k]) return dp[d][k]; for (int i = d + 1; i <= n; i++) { for (int j = 0; j < 6; j++) { if (tmp[i][j].in == tmp[d][k].out) { int a = search(i, j); if (a > dp[d][k]) { dp[d][k] = a; x[d][k] = i, y[d][k] = j; } } } } return ++dp[d][k];}void solve() { int Max = 0, idx, idy, a; for (int i = 1; i <= n; i++) { if (Max + i >= n) break; for (int j = 0; j < 6; j++) { a = search(i, j); if (a > Max) { Max = a; idx = i, idy = j; } } } printf("%d\n", Max); for (int i = 0; i < Max; i++) { printf("%d %s\n", idx, sign[idy]); a = idx; idx = x[idx][idy]; idy = y[a][idy]; } /* printf("%d\n", dp[1][5]); idx = 1; idy = 5; for (int i = 0; idx; i++) { printf("%d %s\n", idx, sign[idy]); a = idx; idx = x[idx][idy]; idy = y[a][idy]; } */}int main() { int cas = 0; while (scanf("%d", &n), n) { Init(); read(); if (cas) printf("\n"); printf("Case #%d\n", ++cas); solve(); } return 0;}

 

 

转载于:https://www.cnblogs.com/suncoolcat/p/3313176.html

你可能感兴趣的文章
MySQL sql语句获取当前日期|时间|时间戳
查看>>
微信支付官方SDK V3 .NET版的坑
查看>>
Python(一)list tuple dict set
查看>>
什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
查看>>
hdu4651(广义五边形数 & 分割函数1)
查看>>
python iter,迭代器&dict,字典详解
查看>>
python笔记1
查看>>
C语言:自定义一个查找字串的功能函数,类似于<string.h>中的strstr()
查看>>
数据库联系 创建表格:重点
查看>>
Regist
查看>>
设置磁盘配额(第二版)
查看>>
C++ 获取字符串中的所有汉字
查看>>
js 滚动到指定位置(带step 速度)
查看>>
项目初尝试——α迭代感想
查看>>
dgraph实现基本操作
查看>>
[Arduino] 基于Xbee Pro和网络技术的智能公交系统设计
查看>>
My97DatePicker日历控件配置
查看>>
HDU 3586-Information Disturbing(树形dp)
查看>>
《超越CSS:web设计精髓》的读后感
查看>>
团队项目第一阶段冲刺站立会议09
查看>>