ZOJ 2714 Uva LA 2995 Image is everything 机智题

题意:

一个n*n*n的立方体,每个单位格子可能是空的,或是一个纯色方块,给你六个面的视图,能看穿用.表示,否则是一个大写字母代表颜色。问最大可能的体积。

分析:

Final题,如同题目,考察机智程度的题。反正我是不够机智。。想半天不会,看了题解还是不知道怎么写。。最后参考了白书训练指南的代码,做法如下:

建一个3维数组存放整个立方体,首先对于能看穿的,那一溜过去都是空的。接下来就是一个染色判断矛盾的过程,循环所有的面的每个位置去给立方体对应位置染色,如果出现矛盾,这个位置就是空的,一直重复做到没有删除。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5
 6 char read(){
 7     char ret;
 8     while(1){
 9         ret = getchar();
10         if (ret == ‘.‘ || (ret >= ‘A‘ && ret <= ‘Z‘)) return ret;
11     }
12 }
13 int n;
14 void getp(int id, int r, int c, int d, int &x, int &y, int &z){
15     if (id == 0) x = n-1-d, y = c, z = n-1-r;
16     if (id == 1) x = c, y = d, z = n-1-r;
17     if (id == 2) x = d, y = n-1-c, z = n-1-r;
18     if (id == 3) x = n-1-c, y = n-1-d, z = n-1-r;
19     if (id == 4) x = r, y = c, z = n-1-d;
20     if (id == 5) x = n-1-r, y = c, z = d;
21 }
22 int x, y, z;
23 char pos[15][15][15], view[6][15][15];
24 int main()
25 {
26     while(scanf("%d", &n) && n)
27     {
28         for (int j = 0; j < n; j++)
29             for (int i = 0; i < 6; i++)
30                 for (int k = 0; k < n; k++)
31                     view[i][j][k] = read();
32         for (int i = 0; i < n; i++)
33             for (int j = 0; j < n; j++)
34                 for (int k = 0; k < n; k++)
35                     pos[i][j][k] = ‘#‘;
36         for (int i = 0; i < 6; i++)
37             for (int j = 0; j < n; j++)
38                 for (int k = 0; k < n; k++) if (view[i][j][k] == ‘.‘){
39                     for (int p = 0; p < n; p++){
40                         getp(i, j, k, p, x, y, z);
41                         pos[x][y][z] = ‘.‘;
42                     }
43                 }
44         bool flag = true;
45         while(flag){
46             flag = false;
47             for (int i = 0; i < 6; i++)
48                 for (int j = 0; j < n; j++)
49                     for (int k = 0; k < n; k++) if (view[i][j][k] != ‘.‘){
50                         for (int p = 0; p < n; p++){
51                             getp(i, j, k, p, x, y, z);
52                             if (pos[x][y][z] == ‘.‘) continue;
53                             if (pos[x][y][z] == ‘#‘){
54                                 pos[x][y][z] = view[i][j][k];
55                                 break;
56                             }
57                             if (pos[x][y][z] == view[i][j][k]) break;
58                             pos[x][y][z] = ‘.‘;
59                             flag = true;
60                         }
61                     }
62         }
63         int ans = 0;
64         for (int i = 0; i < n; i++)
65             for (int j = 0; j < n; j++)
66                 for (int k = 0; k < n; k++)
67                     if (pos[i][j][k] != ‘.‘) ans++;
68         printf("Maximum weight: %d gram(s)\n", ans);
69     }
70     return 0;
71 }
时间: 2024-08-26 11:57:31

ZOJ 2714 Uva LA 2995 Image is everything 机智题的相关文章

UVA LA 7146 2014上海亚洲赛(贪心)

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=648&problem=5158&mosmsg=Submission+received+with+ID+1708713 /** UVA LA 7146 2014上海亚洲赛(贪心) 题目大意:给定敌我双方士兵的数量和每个士兵的攻击力和防守力,如果两个士兵对战,一方

UVa LA 4287 强连通 (类似 hdu 3836)

题目:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=25&problem=2288&mosmsg=Submission+received+with+ID+1488188 本题可在大白书的322页找到. 题意:给你一些有向边,问你至少需要加多少条边使之整个图强连通. 思路:先强连通缩点,缩点之后的图就不连通了

uva 11732 - strcmp() Anyone? 不错的Trie题

题解:http://blog.csdn.net/u013480600/article/details/23122503 我的代码一直TLE,,,看了人家的之后,觉得1.链式前向星比较好,2.*depth而不是每过一个节点就计算,这一点很好 我是基本copy别人的代码,自己加了注释,留个记号,随后重写, 这道题同样作为链式前向星的Trie的模板 #include <cstdio> #include <cstring> #include <iostream> using n

1^k+2^k+3^k+&#183;&#183;&#183; ZOJ 3547 UVA 766

题目链接:点击打开链接 祭出结论:点击打开链接 资料:组合数回代公式:点击打开链接 伯努利数:点击打开链接 点击打开链接 方法一: 首先给出一个神奇的组合数公式: C(n,k)+C(n+1,k)+C(n+2,k)+C(n+3,k)--+C(N,k) 由于: C(n,k)=C(n-1,k)+C(n-1,k-1) 因此 上式  =  - C(n,k+1) +  {  C(n,k+1)+C(n,k)   }  +  C(n+1,k)-- =  - C(n,k+1) +  {C(n+1,k+1}  + 

POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心

题意: 两个凸多面体,可以任意摆放,最多贴着,问他们重心的最短距离. 解法: 由于给出的是凸多面体,先构出两个三维凸包,再求其重心,求重心仿照求三角形重心的方式,然后再求两个多面体的重心到每个多面体的各个面的最短距离,然后最短距离相加即为答案,因为显然贴着最优. 求三角形重心见此: http://www.cnblogs.com/whatbeg/p/4234518.html 代码:(模板借鉴网上模板) #include <iostream> #include <cstdio> #in

Uva LV 2995 Image Is Everything 模拟,坐标映射,视图映射 难度: 1

题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=996 题意 被射击掉了一些列的魔方.组成模仿的每个方块的六个面颜色相同.给六个面的视图,求魔方最多还剩下多少个小块. 魔方最多十阶. 思路 关键在于将视图的坐标(加上视图深度)映射为三维坐标系内的坐标,之后就可以不断删除会造成矛盾的暴露在表面的方块,直到没有方块或者没有矛

ZOJ 3812 We Need Medicine(牡丹江网络赛D题)

ZOJ 3812 We Need Medicine 题目链接 思路:dp[i][j][k]表示第i个物品,组成两个值为j和k的状态,这样会爆掉,所以状态需要转化一下 首先利用滚动数组,可以省去i这维,然后由于j最大记录到50,所以可以把状态表示成一个二进制数s,转化成dp[k] = s,表示组成k状态能组成s,这样空间复杂度就可以接受了,然后这题时限还可以,就这样去转移,然后记录下路径即可 代码: #include <cstdio> #include <cstring> #incl

树状数组 LA 4329 亚洲赛北京赛区题

复习下树状数组 还是蛮有意思的一道题: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=501&page=show_problem&problem=4174 学到几点: 1.树状数组C[i]的构建,一则c[i]=s[i]-s[i-lowbit(i)];这是一直用的做法.如今学到一种新的,直接add(i,a[i]),(s[i]为a[1]到a[i]的和) 2.前缀和思想,

ZOJ 3814 Sawtooth Puzzle(牡丹江网络赛F题)

ZOJ 3814 Sawtooth Puzzle 题目链接 记录状态广搜,把9个拼图都压缩成一个状态,然后去搜索,就是模拟的过程比较麻烦 代码: #include <cstdio> #include <cstring> #include <queue> #include <algorithm> #include <set> using namespace std; typedef unsigned long long ll; int t; int