zoukankan      html  css  js  c++  java
  • 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;
    } 
    
  • 相关阅读:
    web中间件常见漏洞
    心脏滴血与利用
    mimikatz提取windows密码
    Linux文本编辑器
    Linux打包(归档 )压缩命令
    linux文件和目录命令
    SSL原理
    windows server 2008 安装步骤
    渗透测试术语
    centos 7 修改yum配置
  • 原文地址:https://www.cnblogs.com/tcswuzb/p/14417263.html
Copyright © 2011-2022 走看看