给你一个
n
∗
n
∗
n
n*n*n
n∗n∗n的立方体,有一些单位立方体已经没了.单位立方体重1,且颜色是单一的
给出前左右后顶六个视图,判断物体剩下的最大重量.
基本想法:首先如果某个视图里面有一个位置是".",那么那个视图对应视角的n个方块就要全部删完不可,否则会矛盾.
其次,如果出现颜色不同的情况,也得删删,而且不难发现由于每个方格颜色都是一样的,我们可以用三元组
c
o
l
o
r
(
x
,
y
,
z
)
color(x,y,z)
color(x,y,z)代表一个方格的颜色,颜色不同就一直去删掉.
注意坐标系的建立,x轴是怼向屏幕里面的,y轴向右.建立的是右手系.
补题后感想:一直狂错,过不了样例.就是书里面的get函数太容易出错了,这题太细节了.日后再做做吧.
/*
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 15;
const int INF = 1e9+7;
typedef pair<int,int> pii;
char color[maxn][maxn][maxn];
char view[maxn][maxn][maxn];
int n;
void get(int k,int i,int j,int len,int &x,int &y,int &z){
if(k==0){
x = len; y = j;z=i;
}
if(k==1){
x=n-1-j;y=len;z=i;
}
if(k==2){
x= n-1-len;y=n-1-j;z=i;
}
if(k==3){
x=j;y=n-1-len;z=i;
}
if(k==4){
x=n-1-i;y=j;z=len;
}
if(k==5){
x=i;y=j;z=n-1-len;
}
}
int main(){
// freopen("1.txt","r",stdin);
while(cin>>n){
if(n==0) break;
getchar();
for(int i=0;i<n;i++){
string s;
getline(cin,s);
stringstream ss(s);
for(int k=0;k<6;k++){
for(int j=0;j<n;j++){
ss>>view[k][i][j];
}
}
}
// for(int i=0;i<n;i++){
// for(int k=0;k<6;k++){
// for(int j=0;j<n;j++){
// cout<<view[k][i][j];
// }
// }
// cout<<"\n";
// }
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++) color[i][j][k] = '#';
}
}
for(int k=0;k<6;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(view[k][i][j]=='.'){
for(int len=0;len<n;len++){
int x,y,z;
get(k,i,j,len,x,y,z);
color[x][y][z]='.';
}
}
}
}
}
while(true){
bool change = false;
for(int k=0;k<6;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(view[k][i][j]!='.'){
for(int len=0;len<n;len++){
int x,y,z;
get(k,i,j,len,x,y,z);
if(color[x][y][z]=='.') continue;
if(color[x][y][z]=='#'){
color[x][y][z] = view[k][i][j];
break;
}
if(color[x][y][z]==view[k][i][j]) break;
color[x][y][z] = '.';
change = true;
}
}
}
}
}
if(!change) 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++){
if(color[i][j][k]!='.') ans++;
}
}
}
printf("Maximum weight: %d gram(s)\n",ans);
}
return 0;}