UVALive 2995打卡

算法竞赛入门经典训练指南打卡

题目链接:UVALive 2995

思路

主要有以下两点:
	1.如果在这个某个视图下看到的是".",那么说明这个位置往里的n的为止都没有方块
	2.如果某一个地方没有方块,那么从不同视图看到的这个位置的颜色应该不同
所以,只需要将每个方块的颜色存储下来看是否有冲突,有冲突的地方按照第二点改为空即可,最后只需要查看不为空的有多少个

代码如下:

#include <iostream>

#define ton(i , n) for(int i = 1 ; i <= n ; ++ i)
char s[11][11][11] , pos[11][11][11] ;
int n ;

using namespace std ;

void get(int i , int j , int k , int deep , int &x , int &y , int &z){      //得到坐标

    if (j == 1){
        y = deep ;
        x = k ;
        z = i ;
    }
    else if (j == 2){
        z = i ;
        y = n - k + 1 ;
        x = deep ;
    }
    else if (j == 3){
        z = i ;
        y = n - deep + 1 ;
        x = n - k + 1 ;
    }
    else if (j == 4){
        z = i ;
        y = k ;
        x = n - deep + 1 ;
    }
    else if(j == 5){
        z = n - deep + 1 ;
        x = k ;
        y = i ;
    }
    else if (j == 6) {
        z = deep ;
        x = k ;
        y = n - i + 1 ;
    }
}

int main()
{
    while (scanf ("%d" , &n) == 1 && n){
        getchar() ;
        int ans = 0 ;
        ton(i , n) ton(j , n) ton(k , n)
            pos[i][j][k] = '#' ;        //先把pos数组初始化为'#'
        ton(i , n) ton(j , 6){
            ton(k , n){
                scanf ("%c" , &s[n - i + 1][j][k]) ;
                if (s[n - i + 1][j][k] == '.') {        //如果为'.',则说明这个位置往里面里面都没有
                    ton(deep , n){
                        int x , y , z ;
                        get(n - i + 1 , j , k , deep , x , y , z) ;
                        pos[x][y][z] = '.' ;        //往里面循环设为'.'表示没有立方体
                    }
                }
            }
            getchar() ;
        }
        while (true){
            int mark = 1 ;
            ton(i , n) ton(j , 6) ton(k , n){
                if (s[i][j][k] == '.')
                    continue ;      //当该处是空的时候,直接下一个
                ton(deep , n){      //当不是空的时候,循环向里面判断
                    int x , y , z ;
                    get(i , j , k , deep , x , y , z) ;
                    if (pos[x][y][z] == '.') 
                        continue ;      //如果这个位置是空的就直接下一个
                    if (pos[x][y][z] == '#') {      //如果该位置没有被动过
                        pos[x][y][z] = s[i][j][k] ;     //设为显示的颜色
                        break ;     //退出循环
                    }
                    if (pos[x][y][z] == s[i][j][k])
                        break ;     //如果在另一个视图时标记的颜色和当前颜色一样,则说明该位置放此颜色的立方体没有问题 ,退出循环
                    pos[x][y][z] = '.' ;    //如果另一个视图看到的颜色和当前颜色不一样则说明为空
                    mark = 0 ;
                }
            }
            if (mark)       //都合理了就退出
                break ;
        }
        ton(i , n) ton(j , n) ton(k , n) 
            if (pos[i][j][k] != '.') 
                ans ++ ;        //遍历数组,查找立方体的个数
        printf ("Maximum weight: %d gram(s)\n" , ans) ;
    }
    return 0 ;
}

猜你喜欢

转载自blog.csdn.net/just_gong/article/details/107868197