思路:
典型的递归分形问题。第一步要找规律,开始时,我从旋转的角度思考,无法求解。
之后发现以方向标画图: r -> ru -> rulu...发现每次增加的部分为原有部分逆序逆时针转90°。

#include <set>
#include <map>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <deque>
#include <cstdio>
#include <string>
#include <vector>
#include <cctype>
#include <sstream>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <algorithm>
#define SF(a) scanf("%d", &a)
#define PF(a) printf("%d\n", a)
#define SFF(a, b) scanf("%d%d", &a, &b)
#define SFFF(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define SFFFF(a, b, c, d) scanf("%d%d%d%d", &a, &b, &c, &d)
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) (int)(a).size()
#define PB push_back
#define LL long long
#define mod 10007
#define inf 107
#define eps 1e-12
using namespace std;
int buf[20];
int read() {int x = 0; char ch = getchar(); bool f = 0;while (ch < '0' || ch > '9') { if (ch == '-') f = 1; ch = getchar(); }while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();return f ? -x : x;
}
void write(int x) {if (!x) { putchar(48); return; }int l = 0; if (x < 0) putchar('-'), x = -x;while (x) buf[++l] = x % 10, x = x / 10;while (l) putchar(buf[l--] + 48);
}
//-------------------------chc------------------------------//
//e = 0, n = 1, w = 2, s = 3;struct Node {int x, y;int dir;Node(int x = 0, int y = 0, int dir = 0) : x(x), y(y), dir(dir) { }bool operator<(const Node &rhs) const {return x < rhs.x || (x == rhs.x && y < rhs.y);}
};
vector<Node> v;
int n;bool cmp(Node &a, Node &b) { return a.y < b.y; }int dx(int d1, int d2) {if (d1 == 1) return -1;else if (d2 == 3) return 1;else return 0;
}int dy(int d1, int d2) {if (d1 == 0 || d2 == 0) return 1;else return -1;
}Node NextNode(int dir, Node u) {int ndir = (dir+1) % 4;int nx = u.x + dx(u.dir, ndir), ny = u.y + dy(u.dir, ndir);return Node(nx, ny, ndir);
}void solve(int d) {if (d >= n) return;Node preu = v.back();for (int i = SZ(v) - 1; i >= 0; --i) {int predir = v[i].dir;Node cur = NextNode(predir, preu);preu = cur;v.push_back(cur);}solve(d + 1);
}void print() {sort(v.begin(), v.end(), cmp);int stdy = v.front().y;sort(v.begin(), v.end());FOR(i, 0, SZ(v)) {v[i].y -= stdy;}FOR(i, 0, SZ(v)) {if (i == 0 || v[i].x != v[i -1].x) {if(i) putchar('\n');FOR(j, 0, v[i].y) putchar(' ');putchar(v[i].dir & 1 ? '|' : '_');}else {FOR(j, 0, v[i].y - v[i - 1].y - 1) putchar(' ');putchar(v[i].dir & 1 ? '|' : '_');}}cout << endl;
}int main() {while (~SF(n) && n) {v.clear();v.push_back(Node(0, 0, 0));solve(0);print();puts("^");}return 0;
}

习题8-5 折纸痕(Paper Folding, UVa177)相关推荐

  1. 嵊州D5T2 折纸 folding

    折纸 folding [问题描述] 在非常紧张的 NOIP 考试中,有人喜欢啃指甲,有人喜欢转铅笔,有人喜欢撕 纸条,--而小 x 喜欢迷折纸. 现有一个 W * H 的矩形纸张,监考老师想知道,小 ...

  2. 折纸折痕设计软件_折纸简介中的自适应设计

    折纸折痕设计软件 Lately Origami has been my go-to design tool for prototyping complex touch interactions. I' ...

  3. 微软面试题:打印折纸的折痕

    1.题目 请把一段纸条竖着放置在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开.此时折痕是凹下去的,即折痕突起的方向指向纸条的背面. 如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有 ...

  4. C++ 折纸(folding)

    问题描述: 小猪上幼儿园的时候,报名参加了折纸兴趣小组.他表现出了极大的热情, 折出了n件折纸作品.他的作品只有3种,分别是长方形.正方形和三角形. 小猪很想知道他的n件折纸的周长之和. 输入格式: ...

  5. 他们用折纸解决了两个数学难题,还折出了天文望远镜!!

    科学无国界,我们是知识的搬运工. 折纸是一门古老而有趣的艺术,然而当今的科学家们开始从新的角度审视这项艺术形式,将它应用于生活和科学的众多方面--没准,在你身边就有融合了折纸艺术的美妙产物. 当我九岁 ...

  6. 数据结构之二叉树:折纸问题——11

    数据结构之二叉树:Python代码解决折纸问题 折纸问题 要求:请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开.此时折痕是凹下去的,即折痕突起的方向指向纸条的背面.如果从纸 ...

  7. 《袁老师访谈录》第21期《红鸟沙龙》第4期|刘通/折纸艺术家

    红鸟沙龙创立于2021年,由香港科技大学一些师生和校友率先发起于香港.红鸟沙龙邀请学术.文艺.企业等社会各界杰出人士就多元主题做主讲嘉宾以及讨论嘉宾,分享独到的洞察和深刻的思想,在充分发挥网络传播效力 ...

  8. 手工纸盒子_【创意手工】怒赞!如此有趣的儿童折纸,你不学我学!

    折纸糖果盒子 基本的盒子制作方法,这里给大家做了一个简略图,很方便很快的可以完成制作.纸张的大小和后面制作糖果盒子的部分相同,然后用美工刀严则会两个边缘向内裁切大约0.2到0.3厘米.这样就会使得这个 ...

  9. 纸的大小图解_折纸大全图解基础之如何裁切美元尺寸纸张

    本育儿文章是育儿天堂最新发布的<折纸大全图解基础之如何裁切美元尺寸纸张>的详细页面,觉得有用就收藏了,这里给大家转摘到育儿天堂,为了大家阅读方便. 折纸大全图解中有一类折纸教程是比力奇特的 ...

  10. word怎么改一张纸的方向_折纸手工DIY,纸碗怎么折?一张纸就搞定,折法简单,宝宝也能折...

    大家好,我是梅子做手工,每日分享一款手工教程,欢迎大家关注! 今天小编来教大家折一件日常生活中常见的物件,吃饭用的碗.是不是很好奇碗怎么用纸折呢?小编告诉你,纸碗的折法非常简单,只需要一张纸就能搞定, ...

最新文章

  1. day34 异常处理、断言、socket之ftp协议
  2. platform下的js分析_1
  3. Enterprise Library 企业库 V4.1
  4. 中国央行将发行全球首个法定数字货币,消息是真的吗?
  5. 机器学习中为什么使用one-hot编码
  6. java dictionary遍历_遍历 Dictionary,你会几种方式?
  7. catalog move.php,catalog.php
  8. 广告点击率预测_用于广告点击率预测的逻辑回归你会了吗?
  9. JSON与MAP之间的转换
  10. 阿里云成为国内首个时序数据库标准工作组成员
  11. “MapReduce: Simplified Data Processing on Large Clusters”
  12. Glance - 直接操作image
  13. 计算机网络体系结构作业题整理-第一章答案
  14. UNIX系统命令大全
  15. 二次开发时,css中 @font-face 的处理方法
  16. MySQL主从配置(Django实现主从配置读写分离)
  17. 盘点那些效果酷炫的大数据看板
  18. Android开发之UI线程和非UI线程
  19. 浅析swift optional
  20. VMWARE ESXI虚拟机安装系统

热门文章

  1. 如何将Spotify音乐下载并保存为MP3
  2. cafebabe.cc/nazo解答笔记
  3. Django order by 高级用法
  4. Linux中各种 command not found问题解决
  5. 2019年电赛之路——2015年电子设计竞赛A题任务设计
  6. 土耳其央行行长当得不容易 | 经济学人早报精选
  7. 四种用电脑给手机发短信方法
  8. labwindows的学习资料、方法、安装包
  9. HDU 6080 度度熊保护村庄(计算几何+floyd)
  10. python 分词字典的词性_NLP注2“自定义词性与词典实现”,笔记,字典,的