题目链接
题意分析
详细可以参考刘汝佳的《算法竞赛入门经典》(蓝皮书)
首先 可以透过的一定不存在立方体
其次如果一个立方体存在至少两个面确定颜色不一样的话 也是不存在的
存在这样情况的话 我们就一直删除 知道再也删不了为止
CODE:
#include<bits/stdc++.h>
#define M 15
using namespace std;
int n;
char s[7][M][M];
int pos[M][M][M];
char read_char()
{
for(;;)
{
char ch=getchar();
if((ch>='A'&&ch<='Z')||ch=='.') return ch;
}
}
void getpos(int nowat,int ix,int jx,int px,int &x,int &y,int &z)
{//一个三维坐标转换的函数 便于进行修改
if(nowat==1) {x=n-px+1;y=jx;z=n-ix+1;}
if(nowat==2) {x=jx;y=px;z=n-ix+1;}
if(nowat==3) {x=px;y=n-jx+1;z=n-ix+1;}
if(nowat==4) {x=n-jx+1;y=n-px+1;z=n-ix+1;}
if(nowat==5) {x=ix;y=jx;z=n-px+1;}
if(nowat==6) {x=n-ix+1;y=jx;z=px;}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n;++i)
for(int k=1;k<=6;++k)
for(int j=1;j<=n;++j)
s[k][i][j]=read_char();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<=n;++k)
pos[i][j][k]=-1;
for(int k=1;k<=6;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
if(s[k][i][j]!='.') continue;
for(int p=1;p<=n;++p)
{//可以透过的全部删去
int x,y,z;getpos(k,i,j,p,x,y,z);
pos[x][y][z]=0;
}
}
for(;;)
{
bool notdel=1;
for(int k=1;k<=6;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
if(s[k][i][j]=='.') continue;
for(int p=1;p<=n;++p)
{
int x,y,z;getpos(k,i,j,p,x,y,z);
if(pos[x][y][z]==0) continue;
if(pos[x][y][z]==-1)
{
pos[x][y][z]=s[k][i][j]-'A'+1;
break;
}
if(pos[x][y][z]==s[k][i][j]-'A'+1) break;//不存在颜色冲突的话
pos[x][y][z]=0;//存在颜色冲突则应删除
notdel=0;
}
}
if(notdel) break;
}
int tmp=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<=n;++k)
if(pos[i][j][k]!=0) ++tmp;
printf("Maximum weight: %d gram(s)\n",tmp);
}
return 0;
}