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. 十六:SQL注入之查询方式及报错盲注

    在很多注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL查询语句有问题,这时候我们需要用到相关的报错或者盲注进行后续操作,同时作为手工注入的时候,需要提前了解SQL语句能更好的选择对应 ...

  2. ES6 自定义一个实现了Iterator接口的对象

    参考资料 var obj = { data: [1,2,3,4,5], // 这里实际上就是去定义如何实现Iterator接口 [Symbol.iterator](){ const that = th ...

  3. 【Software Test】Basic Of ST

    文章目录 Learning Objective Introduction Software Applications Before Software Testing What is testing? ...

  4. /etc/hosts导致的问题

    今天安装完成orzdba之后,执行./orzdba -l 报如下错误: Usage: Socket::inet_ntoa(ip_address_sv) at /var/lib/mysql/trunk/ ...

  5. CVE-2020-0796复现

    今天整理资料时发现了之前存的一个cve漏洞复现过程,当时打算跟着复现来着,后来也没去复现,今天刚好有时间,所以来复现一下这个漏洞 漏洞讲解 https://www.freebuf.com/vuls/2 ...

  6. 网件wndr4300 ttl连接

    路由成砖而还能进入cfe或uboot等情况下,可以通过ttl快速救砖. r4300主板有TTL的接线脚,脚的顺序可以找在OpenWrt的wiki上找到. 如下图4个TTL针在左下角,从下往上分别是GN ...

  7. [Usaco2007 Dec]宝石手镯

    题目描述 贝茜在珠宝店闲逛时,买到了一个中意的手镯.很自然地,她想从她收集的 N(1 <= N <= 3,402)块宝石中选出最好的那些镶在手镯上.对于第i块宝石,它的重量为W_i(1 & ...

  8. Nginx基础环境搭建

    1.下载docker toolbox https://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ 2.选择好安装目录 一路nex ...

  9. Vue的核心思想

    Vue的核心思想主要分为两部分: 1.数据驱动  2.组件系统 1.数据驱动 在传统的前端交互中,我们是通过Ajax向服务器请求数据,然后手动的去操作DOM元素,进行数据的渲染,每当前端数据交互变化时 ...

  10. uni-app开发经验分享十七: 开发微信公众号(H5)JSSDK 的使用方式

    因为这个jssdk被uni-app坑了好多天,作者说支持1.4版本,但是我用1.4的两个分享的新方法一直不支持. 最后只能放弃了,期待什么时候能更新上. 基本的使用方法:第一步 - 下载使用方式下载地 ...