UVALive.2995 Image Is Everything (思维题 三维坐标转换)
UVALive.2995 Image Is Everything (思维题 三维坐标转换)
题意分析
这题实在是没思路,就照着打了一遍,把不理解的地方,写了注释。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define REP(i,n) for(int i = 0; i<(n) ;++i)// 宏定义一个for循环
#define nmax 10
using namespace std;
char view[6][nmax][nmax];
char pos[nmax][nmax][nmax];
int n;
char read()
{
char ch;
for(;;){
ch = getchar();
if((ch>='A' && ch<= 'Z') || ch == '.')
return ch;
}
}
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;}
//1. k = 0 表示的是前视图,如果发现前视图有一个.的话那么就要把所有后面的
// 都置为.来表示没有方格。 但是这里有一个xy的坐标变换,不明白为什么。 还要思考。
if(k == 1) {x = n-1-j ; y = len ;z = i;}
//2. k = 1 表示的是左视图,如果发现左视图有一个.的话,那么就要把从左向右的对应位置的
// 方格都处理为.。注意这里的坐标变换。由于是从左看的,正视图的最后一层,对应的应该是
// 左视图的第一列,故横坐标x对应的变换应该是x=n-1-j(还需要-1是因为数组从0开始),纵坐标的对应变换应该是
// y = len,即实参中的p,p的实际含义是从这个方格开始向后处理n次,转换成正视图中为对应的y。不难发现z对应的是i。
if(k == 2) {x = n -1 - len; y= n -1- j; z= i;}
//3. k = 2 表示的是后视图(真的好别扭),如果发现后视图中有一个.的话,就要从后往前将对应位置的方格
// 处理为.。 坐标变换,x表示层数,不难推出是 n-1-len(即传入的参数p),y应该是n-1-j(如果画图的话,会发现其实
// 坐标轴都相反,故xy形式类似),也不难看出z相同。
if(k == 3) {x = j; y = n -1 - len; z = i;}
//4. k = 3 表示的是右视图(感觉和左视图类似?)。先看z,不难看出z和i相同。y和en坐标相反,x和j坐标相同。其实会发现,
// 画个图,然后相反就按照相反的公式套一下,相同就是相等。
if(k == 4) {x = n-1-i ; y = j; z = len;}
//5. k = 4 表示的是顶视图,先画个图,然后救护发现,y和j相同,x和i相反,z和len相同。
if(k == 5) {x = i; y = j; z = n-1- len;}
//6. k = 5 表示的是底视图,按照相同的方法,先画图,然后找坐标变换。注意这个底视图是从正视图的那个最左下角的那个块为
// 为底视图的左上角的块的,一开始画错了,找不到正确的变换方程。只有z和len相反,x和i相同,y和j相同。
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n) && n){
//由于数据是按照行给出的额,因此必须按照行读入。故在此处必须要按照一定规则处理。
REP(i,n) REP(k,6) REP(j,n) view[k][i][j] = read();
// 初始化pos数组
REP(i,n) REP(j,n) REP(k,n) pos[i][j][k] = '#';
//由于已经读入了数据,故可以按照视图,从i到j的方向处理view数组了。
//若视图中的某一个方块为.,表示其方向上的所有方块都没有。
REP(k,6) REP(i,n) REP(j,n) if(view[k][i][j] == '.'){
REP(p,n){
int x,y,z;
//我的妈呀传这么多参数干啥呀
get(k,i,j,p,x,y,z);
//看完get函数就会发现其实是对各个视图的.完成了一个坐标变换,处理掉一条线上的.。
//注意这里对实际的的pos数组,即实际保存方块的数组。
pos[x][y][z] = '.';
}
}
for(;;){
bool done = true;
// 开始处理不是.的方块, 如果一视图中某位置不为.那么->
REP(k,6) REP(i,n) REP(j,n) if(view[k][i][j] != '.'){
//接着对n层进行处理
REP(p,n){
int x,y,z;
//和刚才一样进行一个坐标变换,找到方格对应的x,y,z坐标
get(k,i,j,p,x,y,z);
//判断一下 如果实际保存方块的数组中对应位置也是.的话, 继续看下一层。
if(pos[x][y][z] == '.') continue;
//若找到一个方块的颜色还是未确定的话,那么是的这个块的颜色与视图颜色相同,且结束对这一列块的查找。
//原因很简单,从一面看,最多只能看到最外面的那个块的颜色,他后面的也看不到呀
if(pos[x][y][z] == '#') {
pos[x][y][z] = view[k][i][j];
break;
}
//如果这个块已经被赋上颜色了(即不属于上面的2种情况),那么就检查一下,当前块的颜色是否和某视图的颜色相同
//如果相同的话,本列查找结束(结束原因和上面相同),否则的话->
if(pos[x][y][z] == view[k][i][j]) break;
//(接上一个否则),这个块的颜色和视图的颜色对不上号,说明矛盾,即这个块不应该存在,置为.。同时说明,当前
//仍然有不匹配的地方,还需要进行重新的检查.done置为false.
pos[x][y][z] = '.';
done = false;
}
}
if(done) break;
}
//最后遍历方块一遍,输出个数。
int ans = 0;
REP(i,n) REP(j,n) REP(k,n)
if(pos[i][j][k] != '.') ans++;
printf("Maximum weight: %d gram(s)\n",ans);
}
return 0;
}
UVALive.2995 Image Is Everything (思维题 三维坐标转换)的更多相关文章
- UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)
UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There W ...
- UVALive.3708 Graveyard (思维题)
UVALive.3708 Graveyard (思维题) 题意分析 这标题真悲伤,墓地. 在周长为1e4的圆周上等距分布着n个雕塑,现在要加入进来m个雕塑,最终还要使得这n+m个雕塑等距,那么原来的n ...
- zoj 3778 Talented Chef(思维题)
题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...
- cf A. Inna and Pink Pony(思维题)
题目:http://codeforces.com/contest/374/problem/A 题意:求到达边界的最小步数.. 刚开始以为是 bfs,不过数据10^6太大了,肯定不是... 一个思维题, ...
- ZOJ 3829 贪心 思维题
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...
- 洛谷P4643 [国家集训队]阿狸和桃子的游戏(思维题+贪心)
思维题,好题 把每条边的边权平分到这条边的两个顶点上,之后就是个sb贪心了 正确性证明: 如果一条边的两个顶点被一个人选了,一整条边的贡献就凑齐了 如果分别被两个人选了,一作差就抵消了,相当于谁都没有 ...
- C. Nice Garland Codeforces Round #535 (Div. 3) 思维题
C. Nice Garland time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- PJ考试可能会用到的数学思维题选讲-自学教程-自学笔记
PJ考试可能会用到的数学思维题选讲 by Pleiades_Antares 是学弟学妹的讲义--然后一部分题目是我弄的一部分来源于洛谷用户@ 普及组的一些数学思维题,所以可能有点菜咯别怪我 OI中的数 ...
- HDU 1029 Ignatius and the Princess IV / HYSBZ(BZOJ) 2456 mode(思维题,~~排序?~~)
HDU 1029 Ignatius and the Princess IV (思维题,排序?) Description "OK, you are not too bad, em... But ...
随机推荐
- 微信小程序学习笔记(1)-微信小程序样式设置逻辑
1.微信小程序的样式设置统一在每一页的.wxss的样式文件中,所有的样式设置代码统一写入这个文件中: 2.样式主要是通过.wxml里面控件的“class”属性来调用,此处调用会有几个细节要注意: 1) ...
- Python内嵌函数与Lambda表达式
//2018.10.29 内嵌函数与lambda 表达式 1.如果在内嵌函数中需要改变全局变量的时候需要用到global语句对于变 量进行一定的说明与定义 2.内部的嵌套函数不可以直接在外部进行访问 ...
- leetcode-三数之和(java)
三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可 ...
- Spark- 根据IP获取城市(java)
开源 IP 地址定位库 ip2region 1.4 ip2region 是准确率 99.9% 的 IP 地址定位库,0.0x毫秒级查询,数据库文件大小只有 2.7M,提供了 Java.PHP.C.Py ...
- Java进阶知识点:服务端高并发的基石 - NIO与Reactor AIO与Proactor
一.背景 要提升服务器的并发处理能力,通常有两大方向的思路. 1.系统架构层面.比如负载均衡.多级缓存.单元化部署等等. 2.单节点优化层面.比如修复代码级别的性能Bug.JVM参数调优.IO优化等等 ...
- NMAP-端口扫描
1.时序选项 -T0 -> -T5 速度变快,但是准确性下降,nmap默认是T3 2.指定端口 3.扫描指定TCP和UDP端口 4.快速扫描常见100个端口 5.扫描常见的n的端口 6.TCP ...
- 使用树莓派实现(山寨)高清视频叠加(HDMI OSD)
项目需要在HDMI上叠加一些字符包括汉字和数值,要求不能使用台式机,本身也没有HDMI采集卡驱动开发能力,所以通过海思的HDMI编码器将HDMI编码为h.264网络视频流,然后通过树莓派解码显示,做字 ...
- 四、oracle 用户管理二
一.使用profile管理用户口令概述:profile是口令限制,资源限制的命令集合,当建立数据库时,oracle会自动建立名称为default的profile.当建立用户没有指定profile选项时 ...
- Android 上实现非root的 Traceroute -- 非Root权限下移植可执行二进制文件 脚本文件
作者 : 万境绝尘 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/36438365 示例代码下载 : -- CSDN : htt ...
- QT界面绘制学习记录
1. MVC结构中,model必须作为类的成员变量存在,不可再函数内部申明.否则,会出现函数调用结束,model找不到的错误. 2.QcomboBox可设置为左边空白,右侧一小箭头的形式.代码:com ...