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. linux环境下oracle 11g 静默安装

    安装环境 Linux服务器:oracle linux 6.6 64位 Oracle服务器:Oracle11gR2 64位 系统要求 1.Linux安装Oracle系统要求 系统要求 说明 内存 必须高 ...

  2. 剑指Offer58-左转字符串

    题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=" ...

  3. 【Linux】rsync错误解析

    rsync: Failed to exec ssh: No such file or directory (2) rsync error: error in IPC code (code 14) at ...

  4. leetcode 864. 获取所有钥匙的最短路径(BFS,状态压缩)

    题目链接 864. 获取所有钥匙的最短路径 题意 给定起点,要求在最短步骤内收集完所有钥匙,遇到每把锁之前只有 有对应的钥匙才能够打开 思路 BFS+状态压缩典型题目 先确定起点和总的钥匙数目,其次难 ...

  5. C语言逗号运算符(C语言学习笔记)

    什么是逗号运算符 逗号运算符 逗号运算符是指在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值. 用法 多个变量赋值 原因:"=& ...

  6. paramiko模块简单用法

    最简单最基本的用法 1 #__*__coding:utf-8__*__ 2 import paramiko 3 hostname = '192.168.1.1' 4 username = 'root' ...

  7. SQLSERVER 修改数据实例的排序规则

    SQL Server服务器修改排序规则的方法 操作及验证步骤: 1 登录数据库后,查看当前安装数据库默认排序规则的两种方式 方式一.使用SQL Server 2014 Management Studi ...

  8. JS复习笔记一:冒泡排序和二叉树列

    在这里逐步整理一些JS开发的知识,分享给大家: 一:冒泡排序 使用场景:数组中根据某个值得大小来对这个数组进行整体排序 难度:简单 原理:先进行循环,循环获取第一至倒数第二的范围内所有值,对当前值与下 ...

  9. Scrapy———反爬蟲的一些基本應對方法

    1. IP地址驗證 背景:有些網站會使用IP地址驗證進行反爬蟲處理,檢查客戶端的IP地址,若同一個IP地址頻繁訪問,則會判斷該客戶端是爬蟲程序. 解決方案: 1. 讓Scrapy不斷隨機更換代理服務器 ...

  10. OO第三次总结博客

    规格化设计的发展历史 (因为很难寻找,所以参考了下别的同学的调研结果) 规格化设计与结构化.模块化设计密不可分,伴随着OOP语言的发展,规格化设计思想逐渐形成体系,慢慢完善. 20世纪60年代,程序的 ...