LA 2995 Image Is Everything
2024-09-07 19:55:28
题目链接:
题意:
有一个n∗n∗n个不同颜色的单位正方体(每个单位正方体六个面颜色相同)组成的大正方体,现在其中一些单位正方体已经缺失,给定该大正方体的六视图,求这个物体剩下的最大正方体个数。
分析:
首先我们假设这个大正方体是满的,然后根据六视图找到对应的立方体块的颜色,如果矛盾,说明该立方体块不在大正方体中。
不停的判断,遇到矛盾就删除,直到没有矛盾存在,这样剩下的立方体块就是最大的满足条件的立方体块了。
这里在判断矛盾的时候注意:
- 如果视图为’.’,那么该面下面的所有立方体都要删除。
- 在遍历六视图进行判断的时候,如果该面没有涂上颜色, 那么我们就假设这个面是表面,把他涂上颜色即可。如果该面已涂的颜色和当前六视图对应面的颜色相同,即不存在矛盾,那么继续判断六视图下一个面。否则,存在矛盾,该立方体删除。
代码:
/*************************************************************************
> 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;
}
这种套路就是,求最大,那我们就先假设是最大的结果,然后不满足就删去,那么剩下的一定是满足的条件中的最大的。。。
最新文章
- C++知识回顾(一)
- nodeJS搭建本地服务器
- PetaPoco dynamic
- Java NIO非阻塞理论学习
- JDBC存取二进制文件示例
- mysql简单练习
- Thinkpad E430+CentOS 6.4+ linux-3.10.12内核网卡驱动(无线+有线)配置
- POJ 2778 DNA Sequence(AC自动机+矩阵快速幂)
- dcmtk常用命令
- 保存退出vi编辑
- [Java in NetBeans] Lesson 16. Exceptions.
- java.lang.ClassNotFoundException: org.thymeleaf.spring5.view.ThymeleafViewRe。。。。。。。。。。。
- Win10环境配置Bitcoin Core节点
- apigateway-kong(三)Proxy规则
- PHP:第二章——PHP中的while语句
- FCKeditor配置与使用
- mysql的left join、 right join和inner join
- 阿里云服务器ECS LAMP环境安装(Ubuntu)
- selenium 结合 docker 构建分布式测试环境 (初学者视角)
- var和let使用上的对比
热门文章
- 万门大学Python零基础10天进阶班视频教程
- 如何用 CSS 和 D3 创作火焰动画
- 点击tr实现选择checkbox功能,点击checkobx的时候阻止冒泡事件, jquery给checkbox添加checked属性或去掉checked属性不能使checkobx改变状态
- 用Python抓取并分析了1982场英雄联盟数据,教你开局前预测游戏对局胜负!
- mongodb v2.4.9 快速操作记录
- [解读REST] 0.REST 相关参考资料
- Nginx从入门到放弃-第5章 Nginx架构篇
- 使用PYTHON创建XML文档_python
- TOJ1017: Tour Guide
- List容器——LinkedList及常用API,实现栈和队列