题目看上去很棘手,但是仔细想一想,可以找到解决办法。
难点在于,如何解决的姿势。
比如此题,如果只用一个视图位置三维数组,很多点的判断就要写成繁杂的条件判断。
多重循环代码的简化也是很重要的问题。不然调试过程都十分困难。
以下代码逻辑清晰,而且比较精简。需要多多体会,至于所应该的收获,并不是那么明显。
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
char pos[10][10][10];
char view[6][10][10];
int n;
char read()
{
char ch;
while(1)
{
ch=getchar();
if((ch>='A'&&ch<='z')||ch=='.')
return ch;
}
}
void change(int k, int i, int j, int d, int& x, int&y, int&z )
{
if(k==0){x=d;y=j;z=i;}
if(k==1){x=n-1-j;y=d;z=i;}
if(k==2){x=n-1-d;y=n-1-j;z=i;}
if(k==3){x=j;y=n-1-d;z=i;}
if(k==4){x=n-1-i;y=j;z=d;}
if(k==5){x=i;y=j;z=n-1-d;}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)&&n!=0)
{
rep(i,n) rep(k,6) rep(j,n)
view[k][i][j]=read();
rep(i,n)rep(j,n)rep(k,n)
pos[i][j][k]='#';
//must care for the turn of init
rep(k,6)rep(i,n)rep(j,n)
if(view[k][i][j]=='.'){
int x,y,z;
rep(deepth,n){
change(k,i,j,deepth,x,y,z);
pos[x][y][z]='.';
}
}
int flag;
while(1)
{
flag=1;
rep(k,6)rep(i,n)rep(j,n)
if(view[k][i][j]!='.'){
rep(deepth,n){
int x,y,z;
change(k,i,j,deepth,x,y,z);
if(pos[x][y][z]=='.')
continue;
if(pos[x][y][z]=='#'){
pos[x][y][z]=view[k][i][j];
break;
}
if(pos[x][y][z]==view[k][i][j])
break;
flag=0;
pos[x][y][z]='.';
}
}
if(flag)
break;
}
int ans=0;
rep(i,n)rep(j,n)rep(k,n)
if(pos[i][j][k]!='.')
ans++;
printf("Maximum weight: %d gram(s)\n",ans);
}
return 0;
}