UVALive - 2995

UVALive - 2995
题目链接UVALive - 2995
题目大意为有一个nnn(n<=10)的方块,由若干个111的重量为1小方块组成,每个小方块都有唯一颜色(一个小方块的6个面颜色相同)(不同小方块颜色不一定相同),有一些小方块被挖去了,给出该立方体6个面的视图,如果这一列全部被挖去了(即看不到小方块则为‘.’)求该立方体的最大重量。
这又是一道乱搞 题,具体思路就是每次把6个方向的视图遍历一遍,找到不合法的小方块(例如看不到的,或者是在一个小方块的不同面颜色不同)把他们删去,继续遍历,直到找不到不合法的小方块为止。要注意在遍历的时候,视图上小方块的位置和实际上小方块的位置并不一定相同,假设以立方体的左上后方顶点建系,在后面看到的在(1,1)位置的小方块在实际上的位置应该是(1,n,1)。而当当前遍历到的点已经确定为空时,应当向与当前面垂直的轴的方向推进。
下面是完整代码:

#include<stdio.h>
#include<algorithm>
#include<string.h>
int n,cube[11][11][11],flag;
char pos[11][11][11];
void Memset(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(int k=1;k<=n;k++)
				cube[i][j][k]=0x7ffffff;
}
void Operator_1(int p){//前 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			if(pos[p][i][j]=='.')
				for(int wi=n;wi>=1;wi--)
					cube[i][wi][j]=0;
			else{
				for(int wi=n;wi>=1;wi--){
					if(cube[i][wi][j]==0)continue;
					if(cube[i][wi][j]==0x7ffffff){
						cube[i][wi][j]=pos[p][i][j]-'A'+1;
						break;
					}
					if(cube[i][wi][j]!=pos[p][i][j]-'A'+1){
						cube[i][wi][j]=0;
						flag=1;
						continue;
					}
					if(cube[i][wi][j]==pos[p][i][j]-'A'+1)break;
				}
					
			}
		}	
}
void Operator_2(int p){//左 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			if(pos[p][i][j]=='.')
				for(int wi=1;wi<=n;wi++)
					cube[i][j][wi]=0;
			else{
				for(int wi=1;wi<=n;wi++){
					if(cube[i][j][wi]==0)continue;
					if(cube[i][j][wi]==0x7ffffff){
						cube[i][j][wi]=pos[p][i][j]-'A'+1;
						break;
					}
					if(cube[i][j][wi]!=pos[p][i][j]-'A'+1){
						cube[i][j][wi]=0;
						flag=1;
						continue;
					}
					if(cube[i][j][wi]==pos[p][i][j]-'A'+1)break;
				}
					
						
			}
		}	
}
void Operator_3(int p){//后 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			if(pos[p][i][j]=='.')
				for(int wi=1;wi<=n;wi++)
					cube[i][wi][n-j+1]=0;
			else{
				for(int wi=1;wi<=n;wi++){
					if(cube[i][wi][n-j+1]==0)continue;
					if(cube[i][wi][n-j+1]==0x7ffffff){
						cube[i][wi][n-j+1]=pos[p][i][j]-'A'+1;
						break;
					}
					if(cube[i][wi][n-j+1]!=pos[p][i][j]-'A'+1){
						cube[i][wi][n-j+1]=0;
						flag=1;
						continue;
					}
					if(cube[i][wi][n-j+1]==pos[p][i][j]-'A'+1)break;
				}
					
			}
		}	
}
void Operator_4(int p){//右 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			if(pos[p][i][j]=='.')
				for(int wi=n;wi>=1;wi--)
					cube[i][n-j+1][wi]=0;
			else{
				for(int wi=n;wi>=1;wi--){
					if(cube[i][n-j+1][wi]==0)continue;
					if(cube[i][n-j+1][wi]==0x7ffffff){
						cube[i][n-j+1][wi]=pos[p][i][j]-'A'+1;
						break;
					}
					if(cube[i][n-j+1][wi]!=pos[p][i][j]-'A'+1){
						cube[i][n-j+1][wi]=0;
						flag=1;
						continue;
					}
					if(cube[i][n-j+1][wi]==pos[p][i][j]-'A'+1)break;
				}
					
			}
		}	
}
void Operator_5(int p){//顶 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			if(pos[p][i][j]=='.')
				for(int wi=1;wi<=n;wi++)
					cube[wi][i][j]=0;
			else{
				for(int wi=1;wi<=n;wi++){
					if(cube[wi][i][j]==0)continue;
					if(cube[wi][i][j]==0x7ffffff){
						cube[wi][i][j]=pos[p][i][j]-'A'+1;
						break;
					}
					if(cube[wi][i][j]!=pos[p][i][j]-'A'+1){
						cube[wi][i][j]=0;
						flag=1;
						continue;
					}
					if(cube[wi][i][j]==pos[p][i][j]-'A'+1)break;
				}
					
			}
		}	
}
void Operator_6(int p){//底 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			if(pos[p][i][j]=='.')
				for(int wi=n;wi>=1;wi--)
					cube[wi][n-i+1][j]=0;
			else{
				for(int wi=n;wi>=1;wi--){
					if(cube[wi][n-i+1][j]==0)continue;
					if(cube[wi][n-i+1][j]==0x7ffffff){
						cube[wi][n-i+1][j]=pos[p][i][j]-'A'+1;
						break;
					}
					if(cube[wi][n-i+1][j]!=pos[p][i][j]-'A'+1){
						cube[wi][n-i+1][j]=0;
						flag=1;
						continue;
					}
					if(cube[wi][n-i+1][j]==pos[p][i][j]-'A'+1)break;
				}
					
			}
		}	
}
int main()
{
	while(scanf("%d",&n)){
		if(n==0)break;
		Memset();
		int ans=n*n*n;
		for(int j=1;j<=n;j++){
			for(int i=1;i<=6;i++){
				scanf("%s",pos[i][j]);
				for(int k=n;k>=1;k--)
					pos[i][j][k]=pos[i][j][k-1];
			}
			
		}	
		while(1){
			flag=0;
			for(int i=1;i<=6;i++){
				if(i==1)Operator_1(1);
				if(i==2)Operator_2(2);
				if(i==3)Operator_3(3);
				if(i==4)Operator_4(4);
				if(i==5)Operator_5(5);
				if(i==6)Operator_6(6);
			}
			if(flag==0)break;
		}
		
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				for(int k=1;k<=n;k++)
					if(!cube[i][j][k])
						ans--;
		printf("Maximum weight: %d gram(s)\n",ans);
	}
	return 0;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值