LA2995
来源:互联网 发布:天猫和淘宝价格对比 编辑:程序博客网 时间:2024/04/30 12:47
Problem: Image Is Everything
Description: 有一个正方体。现在拍到了它
Solution:
第一步我们可以知道,那些点代表着一条的正方体可以消除掉了。这该怎么做呢?我们最后统计还有多少个小正方体的时候可以统计一个三维数组中标记的点有多少个,因此,我们要建立一个三维的空间坐标系。因为正方体是通过6个正视图来给你的,因此,我们要把平面图中的坐标
第二步比较难一点,我们可以发现这6个正视图都是有颜色的,那么就以为着我们还要利用这些颜色。我们如何来利用这些颜色呢。一开始我就想错了,我当时觉得颜色间的联系就只有棱上的小正方体有。于是写了发代码交上去WA了。后来小看了下刘汝佳大神的书,发现他想得更深刻些,他是说如果发现一个小正方体上的颜色在两个正视图间是不同的,那么就删掉这个小正方体,暴露出新的表面出来,再继续判断。这是什么意思呢?就是说我们首先根据一个正视图上的颜色来给表面上的小正方体涂色。然后再根据其他正视图来判断这个颜色是否和其他正视图看到的颜色一样,如果一样,那么就说明,这个正方体可能是存在的。如果不一样,那么我们就删掉这个正方体,这样在第一步涂色的时候我们就要加上这么一条判断:如果该小正方体不存在,那么就往下一个小立方体涂色,以此类推。这样就能不断暴露新的表面,不断根据不同正视图的颜色来判断小正方体是否存在,知道,所有的6个面都不存在小正方体可以继续删除为止。
Code(JAVA):
import java.util.Scanner;class Plain { static final int M = 12; char[][] point = new char[M][M]; void setLine(char[] line, int index) { for (int i = 0; i < line.length; i++) point[index][i] = line[i]; }}class Node { int x, y, z; Node() { } Node(int x, int y, int z) { this.x = x; this.y = y; this.z = z; }}public class Main { static final int M = 12; static final int E = 6; Scanner cin = new Scanner(System.in); int n; Plain[] plains = new Plain[E]; Node deal_point(int index, int x, int y, int h) { int X = 0, Y = 0, Z = 0; if (index == 0) { Z = n - 1 - x; X = y; Y = h; } else if (index == 1) { Z = n - 1 - x; Y = n - 1 - y; X = h; } else if (index == 2) { Z = n - 1 - x; X = n - 1 - y; Y = n - 1 - h; } else if (index == 3) { Z = n - 1 - x; Y = y; X = n - 1 - h; } else if (index == 4) { Y = n - 1 - x; X = y; Z = n - 1 - h; } else { Y = x; X = y; Z = h; } return new Node(X, Y, Z); } public Main() { for (int i = 0; i < E; i++) plains[i] = new Plain(); while (true) { // init n = cin.nextInt(); if (n == 0) break; for (int i = 0; i < n; i++) { char[] str = new char[M]; for (int j = 0; j < E; j++) { str = cin.next().toCharArray(); plains[j].setLine(str, i); } } // work int[][][] cube = new int[M][M][M]; for (int i = 0; i < M; i++) for (int j = 0; j < M; j++) for (int k = 0; k < M; k++) cube[i][j][k] = 1; for (int i = 0; i < E; i++) { char[][] map = plains[i].point; for (int I = 0; I < n; I++) for (int J = 0; J < n; J++) if (map[I][J] == '.') for (int k = 0; k < n; k++) { Node now = deal_point(i, I, J, k); cube[now.x][now.y][now.z] = 0; } } char[][][] color = new char[M][M][M]; for (int i = 0; i < M; i++) for (int j = 0; j < M; j++) for (int k = 0; k < M; k++) color[i][j][k] = '*'; while (true) { boolean ok = true; for (int i = 0; i < E; i++) { char[][] map = plains[i].point; for (int I = 0; I < n; I++) for (int J = 0; J < n; J++) if (map[I][J] != '.') for (int k = 0; k < n; k++) { Node now = deal_point(i, I, J, k); if (cube[now.x][now.y][now.z] == 0) continue; if (color[now.x][now.y][now.z] == '*') { color[now.x][now.y][now.z] = map[I][J]; break; } if (color[now.x][now.y][now.z] != map[I][J]) { cube[now.x][now.y][now.z] = 0; ok = false; } else break; } } if (ok) break; } int ans = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) for (int k = 0; k < n; k++) ans += cube[i][j][k]; System.out.println("Maximum weight: " + ans + " gram(s)"); } } public static void main(String[] args) { new Main(); }}
- LA2995
- LA2995
- LA2995 模拟
- Image is Everuthing LA2995
- 思维锻炼+LA2995
- LA2995- Image Is Everything
- 【日刷】LA2995
- LA2995(迭代更新)
- LA2995——Image Is Everything
- ceph pg split
- 大力推荐的超牛GitHub top 100的Java开源库
- 根据本地文件,生成百度云文件列表
- js获取ip地址
- Android 使用addview生成列表,界面切换时将指定的行数滚动到列表的第一行
- LA2995
- JAVA多线程(五)用lock、synchronized、阻塞队列三种方法实现生产者消费者模式
- C#中重新定义Console实现自动保存输出到文件
- Android Studio 2.1.1 更换主题 代码样式
- HDU 1075.What Are You Talking About【Map水题(字典树)】【5月25】
- Android 6.0 ConfirmCredential
- 实时人脸检测 (Real-Time Face Detection)
- 阿里云上CentOS6.5部署Django+nginx+uwsgi
- android 蓝牙编程重点---如何发送和接收16进制数据