LA 2995 Image Is Everything

来源:互联网 发布:图像复原的数据集 编辑:程序博客网 时间:2024/06/06 15:04

题目链接:

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=996

题意:

有一个nnn个不同颜色的单位正方体(每个单位正方体六个面颜色相同)组成的大正方体,现在其中一些单位正方体已经缺失,给定该大正方体的六视图,求这个物体剩下的最大正方体个数。

分析:

首先我们假设这个大正方体是满的,然后根据六视图找到对应的立方体块的颜色,如果矛盾,说明该立方体块不在大正方体中。
不停的判断,遇到矛盾就删除,直到没有矛盾存在,这样剩下的立方体块就是最大的满足条件的立方体块了。
这里在判断矛盾的时候注意:

  1. 如果视图为’.’,那么该面下面的所有立方体都要删除。
  2. 在遍历六视图进行判断的时候,如果该面没有涂上颜色, 那么我们就假设这个面是表面,把他涂上颜色即可。如果该面已涂的颜色和当前六视图对应面的颜色相同,即不存在矛盾,那么继续判断六视图下一个面。否则,存在矛盾,该立方体删除。

代码:

/*************************************************************************    > 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;}

这种套路就是,求最大,那我们就先假设是最大的结果,然后不满足就删去,那么剩下的一定是满足的条件中的最大的。。。

0 0
原创粉丝点击