题目链接:

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=996

题意:

有一个n∗n∗n个不同颜色的单位正方体(每个单位正方体六个面颜色相同)组成的大正方体,现在其中一些单位正方体已经缺失,给定该大正方体的六视图,求这个物体剩下的最大正方体个数。

分析:

首先我们假设这个大正方体是满的,然后根据六视图找到对应的立方体块的颜色,如果矛盾,说明该立方体块不在大正方体中。

不停的判断,遇到矛盾就删除,直到没有矛盾存在,这样剩下的立方体块就是最大的满足条件的立方体块了。

这里在判断矛盾的时候注意:

  1. 如果视图为’.’,那么该面下面的所有立方体都要删除。
  2. 在遍历六视图进行判断的时候,如果该面没有涂上颜色, 那么我们就假设这个面是表面,把他涂上颜色即可。如果该面已涂的颜色和当前六视图对应面的颜色相同,即不存在矛盾,那么继续判断六视图下一个面。否则,存在矛盾,该立方体删除。

代码:

/*************************************************************************
> File Name: la2995.cpp
> Author: jiangyuzhu
> Mail: 834138558@qq.com
> Created Time: Sat 18 Jun 2016 05:10:57 PM CST
************************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
#define sa(n) scanf("%d", &(n))
typedef pair<int, int>p;
const int maxn = 10 + 5, mod = 1e9 + 7, oo = 0x3f3f3f3f;
char pic[maxn][maxn][maxn];
char vol[maxn][maxn][maxn];
int n;
void get(int k, int i, int j, int dept, int &x, int &y, int &z)
{
if(k == 0) x = n - 1 - dept, y = j, z = i; // qian
if(k == 1) x = j, y = dept, z = i;//zuo
if(k == 2) x = dept, y = n - 1 - j, z = i;//hou
if(k == 3) x = n - 1 - j, y = n - 1 - dept, z = i;//you
if(k == 4) x = i, y = j, z = dept;//ding
if(k == 5) x = n - 1 - i, y = j, z = n - 1- dept;//di
}
int main (void)
{
while(~scanf("%d", &n) && n){
for(int i = 0; i < n; i++){
for(int k = 0; k < 6; k++){
for(int j = 0; j < n; j++){
char c = getchar();
while(c < 'A'|| c > 'Z'){
if(c == '.') break;
else c = getchar();
}
pic[k][i][j] = c;
}
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
for(int z = 0; z < n; z++){
vol[i][j][z] = '#';
}
}
}
int x, y, z;
for(int k = 0; k < 6; k++){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(pic[k][i][j] == '.'){
for(int m = 0; m < n; m++){
get(k, i, j ,m, x, y, z);
vol[x][y][z] = '.';
}
}
}
}
}
bool found = true;
while(found){
found = false;
for(int k = 0; k < 6; k++){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(pic[k][i][j] != '.'){
for(int m = 0; m < n; m++){
get(k, i, j, m, x, y, z);
if(vol[x][y][z] == '.') continue;
if(vol[x][y][z] == '#'){
vol[x][y][z] = pic[k][i][j];
break;
}
if(vol[x][y][z] == pic[k][i][j]) break;
vol[x][y][z] = '.';
found = true;
}
}
}
}
}
}
int ans = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
for(int m = 0; m < n; m++){
if(vol[i][j][m] != '.') ans++;
}
}
}
printf("Maximum weight: %d gram(s)\n", ans);
}
return 0;
}

这种套路就是,求最大,那我们就先假设是最大的结果,然后不满足就删去,那么剩下的一定是满足的条件中的最大的。。。

LA 2995 Image Is Everything的更多相关文章

  1. [ACM_模拟][ACM_数学] LA 2995 Image Is Everything [由6个视图计算立方体最大体积]

    Description   Your new company is building a robot that can hold small lightweight objects. The robo ...

  2. LA 2995 Image Is Everything 立方体成像 World Final 2004

    有一个 n * n * n 的立方体,其中一些单位立方体已经缺失(剩下部分不一定连通).每个单位立方体重 1 克,且被涂上单一的颜色(即 6 个面的一颜色相同).给出前.左.后.右.顶.底 6 个视图 ...

  3. LA 2995 立方体成像(模拟)

    题目链接:https://vjudge.net/problem/UVALive-2995 这道题的主要难点在于三维坐标系的建立,然后在坐标系中进行迭代更新. 注意用宏定义来简化代码. AC代码: #i ...

  4. AC日记——楼房 codevs 2995

    2995 楼房  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 地平线(x轴)上有n个矩(lou ...

  5. leggere la nostra recensione del primo e del secondo

    La terra di mezzo in trail running sembra essere distorto leggermente massima di recente, e gli aggi ...

  6. Le lié à la légèreté semblait être et donc plus simple

    Il est toutefois vraiment à partir www.runmasterfr.com/free-40-flyknit-2015-hommes-c-1_58_59.html de ...

  7. 扫描线+堆 codevs 2995 楼房

    2995 楼房  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 地平线(x轴)上有n个矩(lou)形(fan ...

  8. Mac Pro 使用 ll、la、l等ls的别名命令

    在 Linux 下习惯使用 ll.la.l 等ls别名的童鞋到 mac os 可就郁闷了~~ 其实只要在用户目录下建立一个脚本“.bash_profile”, vim .bash_profile 并输 ...

  9. Linux中的动态库和静态库(.a/.la/.so/.o)

    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...

随机推荐

  1. 示例vue 的keep-alive缓存功能的实现

    本篇文章主要介绍了vue 的keep-alive缓存功能的实现,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. Vue 实现组件信息的缓存 当我们 ...

  2. MongoDB之Replica Sets环境搭建

    最近学习MongoDB,这两天在搭建复制集的时候碰到了不少问题,也踩了好多坑,现在在这里记录下来,以供自己和他人参考 (因为本人是初学者,所以遇到的问题也会比较初级,所以本文也比较适合初学者查阅) 背 ...

  3. LeetCode(226)Invert Binary Tree

    题目 分析 交换二叉树的左右子树. 递归非递归两种方法实现. AC代码 class Solution { public: //递归实现 TreeNode* invertTree(TreeNode* r ...

  4. stm32L011F3使用开发小记——开发坏境

    今日,因工作需要,使用到了stm32L011F3芯片,此芯片基于CM0+内核,属于低功耗芯片 开发平台可以免费用于KEILMDK,keil公司用免费的许可证,网址:https://www2.keil. ...

  5. HDU - 6199 gems gems gems (DP)

    有n(2e4)个宝石两个人轮流从左侧取宝石,Alice先手,首轮取1个或2个宝石,如果上一轮取了k个宝石,则这一轮只能取k或k+1个宝石.一旦不能再取宝石就结束.双方都希望自己拿到的宝石数比对方尽可能 ...

  6. Persona5

    65536K   Persona5 is a famous video game. In the game, you are going to build relationship with your ...

  7. 安装repo

    $ sudo apt-get install curl -y$ curl "http://android.git.linaro.org/gitweb?p=tools/repo.git;a=b ...

  8. 26、android上跑apache的ftp服务

    一.为啥 在android设备跑ftp服务,在现场方便查看日志,目前就是这么用的. 二.前提: 从apache的官网下载依赖包:http://mina.apache.org/ftpserver-pro ...

  9. # Linux 命令学习记录

    Linux 命令学习记录 取指定文件夹下的任意一个文件,并用vim打开 vi $(ls -l|grep "^-"|head -n 1|awk '{print $9}') 统计给定文 ...

  10. HDU——1799循环多少次(杨辉三角/动态规划/C(m,n)组合数)

    循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...