P.S.模拟真の难打,我花了近乎三小时!o(≧口≦)o 模拟题真的要思路清晰!分块调试。

题意:著名的折纸问题:给你一张很大的纸,对折以后再对折,再对折……每次对折都是从右往左折,因此在折了很多次以后,原先的大纸会变成一个窄窄的纸条。现在把这个纸条沿着折纸的痕迹打开,每次都只打开“一半”,即把每个痕迹做成一个直角,那么从纸的一端沿着和纸面平行的方向看过去,会看到一条美妙的曲线。输入对折次数,请绘出打开后生成的曲线。(P.S.看到画图我就笑了......<( - ︿-)>)

解法:模拟。1.先找到变化规律给每一“笔”编号(这个需要前一笔的方向和现在这一笔的方向共同确定位置,由于用 _ 和 | 输出会有偏差的......);2.再定一个原点,把负数的横、纵坐标的点全部“移”到非负整数处,记下坐标,这样才能输出好;3.依行、列输出。

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<algorithm>
5 #include<iostream>
6 using namespace std;
7
8 const int N=15,NN=13;
9 struct node {int x[1<<N],y[1<<N],s[1<<N];} a[N];
10 struct hp {int x,y,p;} b[N][1<<N];
11 int dir[4][2]={{0,1},{-1,0},{0,-1},{0,0}};//前一个到现在 向右、上、左、下
12 int dirr[4][2]={{0,1},{0,0},{0,-1},{1,0}};//对现在的再调整
13 char str[2]={'_','|'};
14
15 int mmin(int x,int y) {return x<y?x:y;}
16 int mmax(int x,int y) {return x>y?x:y;}
17 bool cmp(hp x,hp y)
18 {
19 if (x.x!=y.x) return x.x<y.x;
20 return x.y<y.y;
21 }
22 void init()
23 {
24 a[0].s[1]=b[0][1].p=0;
25 a[0].x[1]=a[0].y[1]=b[0][1].x=b[0][1].y=0;//原点
26 for (int i=1;i<=NN;i++)
27 {
28 int tt=1<<(i-1),t=1<<i;
29 int mnx=0,mny=0;//最左上端的点离起点的行、列距离
30 a[i].x[0]=a[i].y[0]=0;//源点
31 for (int j=1;j<=t;j++)
32 {
33 if (j<=tt)
34 {
35 a[i].s[j]=a[i-1].s[j];//前一半部分一样
36 a[i].x[j]=a[i-1].x[j];
37 a[i].y[j]=a[i-1].y[j];
38 }
39 else
40 {
41 int p,q;
42 p=(a[i].s[tt-(j-tt)+1]+1)%4,q=a[i].s[j-1];
43 a[i].s[j]=p;
44 a[i].x[j]=a[i].x[j-1]+dirr[p][0]+dir[q][0];//j-1
45 a[i].y[j]=a[i].y[j-1]+dirr[p][1]+dir[q][1];//需要前一个和现在这个配合才行
46 }
47 mnx=mmin(mnx,a[i].x[j]),mny=mmin(mny,a[i].y[j]);//一般为负数
48 }
49 for (int j=1;j<=t;j++)//调整坐标
50 {
51 a[i].x[j]-=mnx,a[i].y[j]-=mny;
52 b[i][j].x=a[i].x[j],b[i][j].y=a[i].y[j];
53 b[i][j].p=a[i].s[j]&1;
54 }
55 sort(b[i]+1,b[i]+1+t,cmp);//为了输出
56 b[i][0].x=b[i][0].y=-1;
57 }
58 }
59 void print(int i)
60 {
61 int x=0,y=0,t=1<<i;
62 for (int j=1;j<=t;j++)
63 {
64 if (b[i][j].x!=b[i][j-1].x)
65 {
66 while (x<b[i][j].x) x++,printf("\n");
67 y=0;
68 }
69 while (y<b[i][j].y) y++,printf(" ");
70 y++,printf("%c",str[b[i][j].p]);
71 }
72 printf("\n^\n");
73 }
74 int main()
75 {
76 init();
77 while (1)
78 {
79 int n;
80 scanf("%d",&n);
81 if (!n) break;
82 print(n);
83 }
84 return 0;
85 }

【uva 177】Paper Folding(算法效率--模拟)的更多相关文章

  1. uva 177:Paper Folding(模拟 Grade D)

    题目链接 题意:一张纸,每次从右往左对折.折好以后打开,让每个折痕都自然的呈90度.输出形状. 思路:模拟折……每次折想象成把一张纸分成了正面在下的一张和反面在上的一张.维护左边和方向,然后输出.细节 ...

  2. 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 ...

  3. 【uva 1617】Laptop(算法效率--贪心,2种理解)

    题意:有N条长度为1的线段,要求使每条线段分别在相应区间,且"空隙"数目最小.输出"空隙"数.(1≤N≤100000) 解法:(P.S.我这题竟做了2个多小时, ...

  4. 【uva 1615】Highway(算法效率--贪心 区间选点问题)

    题意:给定平面上N个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个店,都有一个选出的点离它的欧几里德距离不超过D. 解法:先把问题转换成模型,把对平面的点满足条件的点在x轴的直线上可得到 ...

  5. 关于贪心算法的经典问题(算法效率 or 动态规划)

    如题,贪心算法隶属于提高算法效率的方法,也常与动态规划的思路相挂钩或一同出现.下面介绍几个经典贪心问题.(参考自刘汝佳著<算法竞赛入门经典>).P.S.下文皆是我一个字一个字敲出来的,绝对 ...

  6. 训练指南 UVA - 11383(KM算法的应用 lx+ly >=w(x,y))

    layout: post title: 训练指南 UVA - 11383(KM算法的应用 lx+ly >=w(x,y)) author: "luowentaoaa" cata ...

  7. CUDA并行计算 | CUDA算法效率提升关键点概述

    文章目录 前言 存取效率 计算效率 性能优化要点 展现足够的并行性 优化内存访问 优化指令执行 前言   CUDA算法的效率总的来说,由存取效率和计算效率两类决定,一个好的CUDA算法必定会让两类效率 ...

  8. 【bzoj 3433】{Usaco2014 Jan} Recording the Moolympics(算法效率--贪心)

    题意:给出n个区间[a,b),有2个记录器,每个记录器中存放的区间不能重叠.求2个记录器中最多可放多少个区间. 解法:贪心.只有1个记录器的做法详见--关于贪心算法的经典问题(算法效率 or 动态规划 ...

  9. Paper Folding UVA - 177 模拟+思路+找规律

    题目:题目链接 思路:1到4是很容易写出来的,我们先考虑这四种情况的绘制顺序 1:ru 2:rulu 3:rululdlu 4:rululdluldrdldlu 不难发现,相较于前一行,每一次增加一倍 ...

随机推荐

  1. ICMP协议概述

    • ICMP是三层协议,和IP.ARP.ICMP同属三层    • IP协议中的6是代表上层的TCP协议,17代表UDP协议,1代表同层的ICMP协议    • ICMP协议主要用来探测       ...

  2. python列表字符串集合常用方法

    1.1 列表常用方法 # 1. append 用于在列表末尾追加新的对象a = [1,2,3]a.append(4) # the result : [1,2,3,4]​# 2. count方法统计某个 ...

  3. 【Oracle】substr()函数详解

    Oracle的substr函数简单用法 substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个 ...

  4. Apache目录详解

    Apache的主要目录和配置文件理解 参考链接:http://httpd.apache.org/docs/2.4/misc/security_tips.html 一.Apache主要配置文件注释(演示 ...

  5. Pulsar vs Kafka,CTO 如何抉择?

    本文作者为 jesse-anderson.内容由 StreamNative 翻译并整理. 以三个实际使用场景为例,从 CTO 的视角出发,在技术等方面对比 Kafka 和 Pulsar. 阅读本文需要 ...

  6. Nacos集成学习入门

    微服务注册中心nacos学习:先尝试使用它,然后撸它源码搞懂它. 在这里整理一下自己之前集成nacos的内容. 我的github地址:https://github.com/mrxiaobai-wen/ ...

  7. ubuntu20.04并添加桌面快捷方式,以安装火狐可浏览器开发版(水狐)为例

    @参考原文 1. 下载linux版源文件 从火狐官网下载linux版的水狐源文件压缩包,@火狐浏览器开发版(水狐)下载地址. 2. 解压下载源文件 将下载的"tar.bz2"文件解 ...

  8. [Usaco2010 Hol]cowpol 奶牛政坛

    题目描述: 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可 ...

  9. mybatis-plubs条件构造器中的方法所对应的sql语法

    [通用条件:] [比较大小: ( =, <>, >, >=, <, <= )] eq(R column, Object val); // 等价于 =,例: eq(& ...

  10. Java多线程基础知识笔记(持续更新)

    多线程基础知识笔记 一.线程 1.基本概念 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是 ...