LA2995

来源:互联网 发布:天猫和淘宝价格对比 编辑:程序博客网 时间:2024/04/30 12:47

Problem: Image Is Everything
Description: 有一个正方体。现在拍到了它6个面的正视图。这个正方体有事由一个个的111的小正方体组成的,每个小正方体的6个面都涂了相同的一种颜色。输入中的点代表着该位置看不到小正方体了。现在给你一个NNN的大正方体,问你这个大正方体最多可能由多少小正方体组成。
Solution:
第一步我们可以知道,那些点代表着一条的正方体可以消除掉了。这该怎么做呢?我们最后统计还有多少个小正方体的时候可以统计一个三维数组中标记的点有多少个,因此,我们要建立一个三维的空间坐标系。因为正方体是通过6个正视图来给你的,因此,我们要把平面图中的坐标(x,y)转化成空间中的坐标(X,Y,Z),这个过程画个图就很好解决了。

第二步比较难一点,我们可以发现这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();    }}
0 0