LA 2995 Image Is Everything
2016-06-18 20:30
369 查看
题目链接:
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=996题意:
有一个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; }
这种套路就是,求最大,那我们就先假设是最大的结果,然后不满足就删去,那么剩下的一定是满足的条件中的最大的。。。
相关文章推荐
- 构造函数和析构函数
- LA 2995 Image Is Everything
- LA 2995 Image Is Everything
- C语言代码搜索神器for Mac
- tomcat java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListen
- JS交互的方法(下)WKWebView
- EZ的间谍网络(codevs 4093)
- 华为OJ平台——字符串通配符
- android五中方式调用服务service中的方法
- videoconverter转换
- A* 寻路
- hibernate笔记
- SecureCRT 连接虚拟机Linux
- 线程同步(计时器)
- SpringMvc Eclipse搭建web项目
- dump
- LeetCode 63. Unique Paths II
- myEclipse中的web项目直接引入到eclipse中运行
- 二叉搜索树
- MVCC