思路

如果两个面看到颜色不同,则这个正方体一定要被删掉

然后依次考虑每个面即可

注意坐标的映射

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
char see[20][20][20],mat[20][20][20],n;
void get(int pos,int i,int j,int k,int &x,int &y,int &z){
if(pos==1){
x=k;
y=j;
z=i;
}
else if(pos==2){
x=n-j+1;
y=k;
z=i;
}
else if(pos==3){
x=n-k+1;
y=n-j+1;
z=i;
}
else if(pos==4){
x=j;
y=n-k+1;
z=i;
}
else if(pos==5){
x=n-i+1;
y=j;
z=k;
}
else{
x=i;
y=j;
z=n-k+1;
}
}
char get_nxt(void){
char c=getchar();
while(c==' '||c=='\n'||c=='\r'||c=='\0')
c=getchar();
return c;
}
int main(){
while(scanf("%d",&n)==1&&n){
memset(see,0,sizeof(see));
memset(mat,0,sizeof(mat));
for(int i=1;i<=n;i++){
for(int j=1;j<=6;j++)
for(int k=1;k<=n;k++)
see[j][i][k]=get_nxt();
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
mat[i][j][k]='#';
for(int i=1;i<=6;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
if(see[i][j][k]=='.')
for(int p=1;p<=n;p++){
int x,y,z;
get(i,j,k,p,x,y,z);
mat[x][y][z]='.';
}
while(1){
int isok=true;
for(int i=1;i<=6;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
if(see[i][j][k]!='.')
for(int p=1;p<=n;p++){
int x,y,z;
get(i,j,k,p,x,y,z);
if(mat[x][y][z]=='.')
continue;
if(mat[x][y][z]=='#'){
mat[x][y][z]=see[i][j][k];
break;
}
if(mat[x][y][z]==see[i][j][k])
break;
mat[x][y][z]='.';
isok=false;
}
if(isok)
break;
}
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
if(mat[i][j][k]!='.')
ans++;
printf("Maximum weight: %d gram(s)\n",ans);
}
return 0;
}
05-02 14:30