参考了https://blog.csdn.net/weizhuwyzc000/article/details/47038989
我一开始看了很久, 拿纸折了很久, 还是折不出题目那样。。一脸懵逼
后来发现不能按照平时那样折一下然后再旋转90度再折, 应该一直折……
后来观察到了规律, 发现其实一直在复制, 只是位置不太一样。但是不知道怎么实现这个过程
然后去看了上面的博客。
发现它
把折纸这个过程规定了一种“标准”, 也就是方向, 上下左右。
这一步非常关键, 因为这使得折纸可以转化成了一堆步骤, 组合成了一条路径。
然后之前找出的规律也可以定量的表示出来。
#include<cstdio> #include<cstring> #include<algorithm> #define REP(i, a, b) for(int i = (a); i < (b); i++) using namespace std; const int MAXN = 5123; const char* word = "ludr"; char s[MAXN][MAXN], buf[MAXN<<1]; int max_y[MAXN]; inline int id(char x) { return strchr(word, x) - word; } inline void up(int &a, int b) { a = max(a, b); } inline void down(int &a, int b) { a = min(a, b); } void update(char a, char b, int& x, int& y) { if(a == 'u') x--, y += (b == 'l' ? -1 : 1); if(a == 'd') y += (b == 'l' ? -1 : 1); if(a == 'l') y--, x += (b == 'd'); if(a == 'r') y++, x += (b == 'd'); } int main() { int n, len; while(~scanf("%d", &n) && n) { memset(s, 0, sizeof(s)); memset(max_y, 0, sizeof(max_y)); buf[0] = 'r'; buf[1] = 'u'; buf[2] = '\0'; int cnt = 1; while(cnt < n) { len = strlen(buf); REP(i, 0, len) { if(i < (len >> 1)) buf[len+i] = word[3-id(buf[i])]; else buf[len+i] = buf[i]; } cnt++; buf[len<<1] = '\0'; } int x = MAXN >> 1, y = MAXN >> 1; int max_x = x, min_x = x, min_y = y; len = strlen(buf); s[x][y] = '_'; REP(i, 1, len) { update(buf[i-1], buf[i], x, y); s[x][y] = (buf[i-1] == 'u' || buf[i-1] == 'd') ? '_' : '|'; up(max_x, x); up(max_y[x], y); down(min_x, x); down(min_y, y); } REP(i, min_x, max_x + 1) { REP(j, min_y, max_y[i] + 1) putchar(s[i][j] == 0 ? ' ' : s[i][j]); puts(""); } puts("^"); } return 0; }