方法: 建立空间直角坐标系,把六个视角看到的投影到坐标系中,看六个视角看到的是否会有冲突,有冲突代表改点不存在
PS: 某渣实在是不想吐槽了,初始化的是把.写成了* 特么害我一直以为我坐标系建错了,找了好久啊.....(┬_┬)哭了
代码:
#include<stdio.h>
#include<string.h>
#define maxn 12
#define REP(i,n) for(int i= 1; i<= (n); i++)
char view[8][maxn][maxn];
char pos[maxn][maxn][maxn];
int n;
int get_char()
{
char ch;
while(1)
{
ch= getchar();
if( (ch>= 'A' && ch<= 'Z') || ch =='.')
return ch;
}
}
void hehe(int k, int i, int j, int len, int &x, int &y, int &z)
{
if(k == 1){ x= n- len + 1, y= j, z= n- i + 1;}
if(k == 2){ x= j, y= len, z= n- i + 1;}
if(k == 3){ x= len, y= n- j+ 1, z= n- i + 1;}
if(k == 4){ x= n- j+ 1, y= n- len+ 1, z= n- i+ 1;}
if(k == 5){ x= i, y= j, z= n- len + 1;}
if(k == 6){ x= n- i +1, y= j, z= len;}
}
//把视图上的点投影到坐标系中
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
REP(i,n) REP(k,6) REP(j,n)
view[k][i][j]= get_char();
REP(x,n) REP(y,n) REP(z,n)
pos[x][y][z]= '#';
REP(k,6) REP(i,n) REP(j,n)
if(view[k][i][j] == '.')
REP(p,n)
{
int x, y, z;
hehe(k, i, j, p, x, y, z);
pos[x][y][z]= '.'; //之前这里写成了'*',找错找了好久啊
}
while(1)
{
int flag= 1;
REP(k,6) REP(i,n) REP(j,n)
if(view[k][i][j]!= '.')
REP(p,n)
{
int x,y,z;
hehe(k, i, j, p, x, y, z);
if(pos[x][y][z]!='.')
{
if(pos[x][y][z]!= view[k][i][j])
{
if(pos[x][y][z] == '#')
pos[x][y][z]= view[k][i][j];
else
pos[x][y][z]= '.';
flag= 0;
}
break;
}
}
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;
}