#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
char pos[10][10][10];
char view[6][10][10];
int n;
void get(int k,int i,int j,int len,int &x,int &y,int &z)
{
//根据6个视图的不同性质得到x,y,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;
}
}
char getch()
{
char ch;
while(true)
{
ch=getchar();
if(ch>='A'&&ch<='Z'||ch=='.')
return ch;
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int i,j,k,p;
if(n==0)
break;
for(i=0; i<n; i++)
for(k=0; k<6; k++)
for(j=0; j<n; j++)
view[k][i][j]=getch();
for(i=0; i<n; i++)
for(j=0; j<n; j++)
for(k=0; k<n; k++)
pos[i][j][k]='#';
for(k=0; k<6; k++)
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(view[k][i][j]=='.')
for(p=0; p<n; p++)
{
int x,y,z;
get(k,i,j,p,x,y,z);//根据视图获得相应点的三维坐标x,y,z
pos[x][y][z]='.';
}
for(;;)//每次查找找到矛盾的两个小方格,删除,直到不存在矛盾为止
{
bool flag=true;
for(k=0; k<6; k++)
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(view[k][i][j]!='.')
{
for(p=0; p<n; p++) //每个视图点对应的一条n长度的格子条
{
int x,y,z;
get(k,i,j,p,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;//颜色相同,证明不矛盾结束
pos[x][y][z]='.';//颜色矛盾,删除
flag=false;
}
}
if(flag)
break;
}
int s=0;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
for(k=0; k<n; k++)
if(pos[i][j][k]!='.')s++;
printf("Maximum weight: %d gram(s)\n",s);
}
return 0;
}
UVALive 2995 Image Is Everything 策略问题
猜你喜欢
转载自blog.csdn.net/h201601060805/article/details/77933258
今日推荐
周排行