uva 177:Paper Folding(模拟 Grade D)
题意:一张纸,每次从右往左对折。折好以后打开,让每个折痕都自然的呈90度。输出形状。
思路:模拟折……每次折想象成把一张纸分成了正面在下的一张和反面在上的一张。维护左边和方向,然后输出。细节有点多。
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std; #define N (1<<13)+10 struct Paper{
int l, r;
bool isFace;
Paper(){}
Paper(int _l, int _r, bool is) : l(_l), r(_r), isFace(is){}
}paper[N]; int data[N]; int pp; void flod(Paper &now) {
int mid = (now.l+now.r)/;
data[mid] = now.isFace?:-;
//printf("%d %c %d\n", now.l, "^v"[data[mid]==1], now.r);
if( now.isFace ) {
paper[pp++] = Paper(mid,now.r,!now.isFace);
now.r = mid;
} else {
paper[pp++] = Paper(mid,now.r,now.isFace);
now.r = mid;
now.isFace = !now.isFace;
} } struct Point{
int x,y;
int way;
Point(int x=, int y=, int way=-):x(x),y(y),way(way){}
}point[N]; enum{
R,U,L,D
}; char mat[][];
void showGraph(int end) {
point[] = Point(,,R);
//printf("%d,%d,%c\n",0,0,"RULD"[R]);
int lmost = ;
int umost = ;
int rmost = ;
int dmost = ;
for (int i = ; i < end; i++) {
int way = (point[i-].way+data[i]+)%;
int x = point[i-].x;
int y = point[i-].y; // 细节:找出现在的位置
switch(point[i-].way) {
case R: y += ; break;
case L: y -= ; break;
case U: x -= ; break;
case D: break;
}
switch (way) {
case R: y += ; break;
case L: y -= ; break;
case U: break;
case D: x += ; break;
} point[i] = Point(x, y, way); //printf("%d,%d,%c\n",x,y,"RULD"[way]); umost = min(umost, x);
dmost = max(dmost, x); lmost = min(lmost, y);
rmost = max(rmost, y);
}
//printf(" %d \n%d %d\n %d\n", umost, lmost, rmost, dmost);
memset(mat, ' ', sizeof(mat));
for (int i = ; i < end; i++) {
mat[point[i].x-umost][point[i].y-lmost] = (point[i].way == L || point[i].way == R)?'_':'|';
}
dmost = dmost - umost;
rmost = rmost - lmost;
for (int i = ; i <= dmost; i++) {
mat[i][rmost+] = ;
int p = rmost;
while (mat[i][p] == ' ') mat[i][p--] = ;
printf("%s\n", mat[i]);
}
puts("^");
//printf(" %d \n%d %d\n %d\n", umost, lmost, rmost, dmost);
} int main() {
int n;
while (scanf("%d", &n) != EOF) {
if (n == ) break;
pp = ;
paper[pp++] = Paper(,<<n,true); memset(data, -, sizeof(data));
for (int i = ; i < n; i++) {
int nowpp = pp;
for (int j = ; j < nowpp; j++) {
flod(paper[j]);
}
} //for (int i = 1; i < (1<<n); i++) {
// printf("%c ", "^v"[data[i]==1]);
//}puts(""); showGraph(<<n);
}
return ;
}
uva 177:Paper Folding(模拟 Grade D)的更多相关文章
- Uva - 177 - Paper Folding
If a large sheet of paper is folded in half, then in half again, etc, with all the folds parallel, t ...
- 【uva 177】Paper Folding(算法效率--模拟)
P.S.模拟真の难打,我花了近乎三小时!o(≧口≦)o 模拟题真的要思路清晰!分块调试. 题意:著名的折纸问题:给你一张很大的纸,对折以后再对折,再对折--每次对折都是从右往左折,因此在折了很多次以后 ...
- Paper Folding UVA - 177 模拟+思路+找规律
题目:题目链接 思路:1到4是很容易写出来的,我们先考虑这四种情况的绘制顺序 1:ru 2:rulu 3:rululdlu 4:rululdluldrdldlu 不难发现,相较于前一行,每一次增加一倍 ...
- UVA 1594:Ducci Sequence (模拟 Grade E)
题意: 对于一个n元组(a0,a1,...),一次变换后变成(|a0-a1|,|a1-a2|,...) 问1000次变换以内是否存在循环. 思路: 模拟,map判重 代码: #include < ...
- UVA 1593: Alignment of Code(模拟 Grade D)
题意: 格式化代码.每个单词对齐,至少隔开一个空格. 思路: 模拟.求出每个单词最大长度,然后按行输出. 代码: #include <cstdio> #include <cstdli ...
- UVA 1589:Xiangqi (模拟 Grade D)
题目: 象棋,黑棋只有将,红棋有帅车马炮.问是否死将. 思路: 对方将四个方向走一步,看看会不会被吃. 代码: 很难看……WA了很多发,还越界等等. #include <cstdio> # ...
- UVa 11210 - Chinese Mahjong 模拟, 枚举 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVA 1156 - Pixel Shuffle(模拟+置换)
UVA 1156 - Pixel Shuffle 题目链接 题意:依据题目中的变换方式,给定一串变换方式,问须要运行几次才干回复原图像 思路:这题恶心的一比,先模拟求出一次变换后的相应的矩阵,然后对该 ...
- UVA 12050 - Palindrome Numbers 模拟
题目大意:给出i,输出第i个镜像数,不能有前导0. 题解:从外层开始模拟 #include <stdio.h> int p(int x) { int sum, i; ;i<=x;i+ ...
随机推荐
- 笔记1 python入门学习笔记
目录 官方手册 菜鸟站手册地址: python的运行方法 注释 小技巧: input()接收用户输入的内容(默认为字符串) print() 运算符 is 是判断两个标识符是不是引用自一个对象 all和 ...
- 第2章 CentOS7集群环境配置
目录 2.1 关闭防火墙 2.2 设置固定IP 2.3 修改主机名 2.4 添加用户 2.5 修改用户权限 2.6 新建目录 2.7 安装JDK 1.卸载系统自带的JDK 2.安装JDK 2.8 克隆 ...
- Python中的set
set_lst = [ ('集合容器不可哈希',), ('集合中的元素必须可哈希',), ('集合是无序的',), ('集合自动去重',), ('增',), ('删',), ('查',), ('集合运 ...
- Selenium与PhantomJS【转】
爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider) 之间恢宏壮阔的斗争... Day 1 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpCli ...
- 笔记-python-standard library-9.6 random
笔记-python-standard library-9.6 random 1. random source code:Lib/random.py 1.1. functions for ...
- 读书笔记jvm探秘之二: 对象创建
对象是面向对象设计语言无法回避的东西,可见其重要性,JAVA的对象相较于C++来说,不算很复杂,但是我们看到一句话背后往往有很多东西值得探讨(NEW关键字). 对象如何被创建? 首先一句简单的NEW语 ...
- Android输入法弹出时覆盖输入框问题
本文来自网易云社区 作者:孙有军 当一个activity中含有输入框时,我们点击输入框,会弹出输入法界面,整个界面的变化效果与manifest中对应设置的android:windowSoftInput ...
- SQL语句Not IN优化方案
总结网友们在CSDN社区上对于not in的优化策略,整理如下,备查. select * from emp where emp_no not in (select emp_no from emp ...
- Python 拓展之详解深拷贝和浅拷贝
正式开始 首先我在这介绍两个新的小知识,要在下面用到.一个是函数 id() ,另一个是运算符 is.id() 函数就是返回对象的内存地址:is 是比较两个变量的对象引用是否指向同一个对象,在这里请不要 ...
- Python之实现不同版本线程池
1.利用queue和threading模块可以实现多个版本的线程池,这里先贴上一个简单的 import queue import time import threading class ThreadP ...