UVALive 2995 Image Is Everything

题目链接

题意分析

详细可以参考刘汝佳的《算法竞赛入门经典》(蓝皮书)

首先 可以透过的一定不存在立方体

其次如果一个立方体存在至少两个面确定颜色不一样的话 也是不存在的

无标题2.png

存在这样情况的话 我们就一直删除 知道再也删不了为止

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;
} 
原文地址:https://www.cnblogs.com/tcswuzb/p/14417263.html