算法竞赛入门经典训练指南打卡
题目链接: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 ;
}