例题6 立方体成像(LA 2995)

给你一个 n ∗ n ∗ n n*n*n nnn的立方体,有一些单位立方体已经没了.单位立方体重1,且颜色是单一的
给出前左右后顶六个视图,判断物体剩下的最大重量.
基本想法:首先如果某个视图里面有一个位置是".",那么那个视图对应视角的n个方块就要全部删完不可,否则会矛盾.
其次,如果出现颜色不同的情况,也得删删,而且不难发现由于每个方格颜色都是一样的,我们可以用三元组 c o l o r ( x , y , z ) color(x,y,z) color(x,y,z)代表一个方格的颜色,颜色不同就一直去删掉.
注意坐标系的建立,x轴是怼向屏幕里面的,y轴向右.建立的是右手系.
补题后感想:一直狂错,过不了样例.就是书里面的get函数太容易出错了,这题太细节了.日后再做做吧.

/*
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 15;
const int INF = 1e9+7;
typedef pair<int,int> pii;
char color[maxn][maxn][maxn];
char view[maxn][maxn][maxn];
int n;
void get(int k,int i,int j,int len,int &x,int &y,int &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;
	}
}
int main(){
//	freopen("1.txt","r",stdin);
	while(cin>>n){
		if(n==0) break;
		getchar();
		for(int i=0;i<n;i++){
			string s;
			getline(cin,s);
			stringstream ss(s);
			for(int k=0;k<6;k++){
				for(int j=0;j<n;j++){
					ss>>view[k][i][j];
				}
			}
		}
//		for(int i=0;i<n;i++){
//			for(int k=0;k<6;k++){
//				for(int j=0;j<n;j++){
//					cout<<view[k][i][j];
//				}
//			}
//			cout<<"\n";
//		}
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				for(int k=0;k<n;k++) color[i][j][k] = '#';
			}
		}
		for(int k=0;k<6;k++){
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					if(view[k][i][j]=='.'){
						for(int len=0;len<n;len++){
							int x,y,z;
							get(k,i,j,len,x,y,z);
							color[x][y][z]='.';
						}
					}
				}
			}
		}
		while(true){
			bool change = false;
			for(int k=0;k<6;k++){
				for(int i=0;i<n;i++){
					for(int j=0;j<n;j++){
						if(view[k][i][j]!='.'){
							for(int len=0;len<n;len++){
								int x,y,z;
								get(k,i,j,len,x,y,z);
								if(color[x][y][z]=='.') continue;
								if(color[x][y][z]=='#'){
									color[x][y][z] = view[k][i][j];
									break;
								}
								if(color[x][y][z]==view[k][i][j]) break;
								color[x][y][z] = '.';
								change = true;
							}
						}
					}
				}
			}
			if(!change) break;
		}
		int ans = 0;
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				for(int k=0;k<n;k++){
					if(color[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
发出的红包

打赏作者

minato_yukina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值