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

Posted fan-jiaming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Paper Folding UVA - 177 模拟+思路+找规律相关的知识,希望对你有一定的参考价值。

题目:题目链接

思路:1到4是很容易写出来的,我们先考虑这四种情况的绘制顺序

  1:ru

  2:rulu

  3:rululdlu

  4:rululdluldrdldlu

  不难发现,相较于前一行,每一次增加一倍数量,并且增加的这部分前一半和原来正好相反,后一半相同,根据这一性质,预处理出极端情况13的解答字符串,然后绘制即可,注意控制行尾空格

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <string>
 6 #include <vector>
 7 #include <map>
 8 #include <set>
 9 #include <queue>
10 #include <deque>
11 
12 #define FRER() freopen("in.txt", "r", stdin)
13 #define FREW() freopen("out.txt", "w", stdout)
14 
15 #define INF 0x3f3f3f3f
16 
17 using namespace std;
18 
19 char ans[10000], _map[20000][20000];
20 int _max[20000];
21 
22 char cal(char ch) {
23     if(ch == l)
24         return r;
25     if(ch == r)
26         return l;
27     if(ch == u)
28         return d;
29     if(ch == d)
30         return u;
31 }
32 
33 int main()
34 {
35     //FRER();
36     //FREW();
37     ios::sync_with_stdio(0);
38     cin.tie(0);
39     
40     ans[0] = r;
41     ans[1] = u;
42     for(int i = 2; i < 14; ++i) {
43         int n = 1 << (i - 2), m = 1 << (i - 1);        
44         for(int j = 0; j < n; ++j) {
45             ans[j + m] = cal(ans[j]);
46         }
47         for(int j = 0; j < 1 << (i - 2); ++j) {
48             ans[j + m + n] = ans[j + n];
49         }
50     }
51     ans[1 << 13] = ;
52     cout << ans << endl;
53     int n;
54     while(cin >> n, n) {
55         memset(_map, 0, sizeof(_map));
56         memset(_max, 0, sizeof(_max));
57         int minl = 10000, maxl = 10000, minc = 10000, maxc = 10000;
58         int l = 10000, c = 10000;
59         int m = 1 << n;
60         _max[10000] = 10000;
61         _map[l][c] = _;
62         for(int i = 1; i < m; ++i) {
63             if(ans[i - 1] == l) 
64                 --c;
65             else if(ans[i - 1] == r)
66                 ++c;
67             else if(ans[i - 1] == u)
68                 --l;
69             
70             if(ans[i] == u) {
71                 
72                 _map[l][c] = |;
73             }
74             else if(ans[i] == d) {
75                 ++l;
76                 _map[l][c] = |;
77             }
78             else if(ans[i] == l) {
79                 --c;
80                 _map[l][c] = _;
81             }
82             else {
83                 ++c;
84                 _map[l][c] = _;
85             }
86             minl = min(minl, l);
87             minc = min(minc, c);
88             maxl = max(maxl, l);
89             _max[l] = max(_max[l], c);
90         }
91         for(int i = minl; i <= maxl; ++i) {
92             for(int j = minc; j <= _max[i]; ++j) 
93                 cout << (_map[i][j] == 0 ?   : _map[i][j]);
94             cout << endl;
95         }
96         cout << ^ << endl;
97     }
98     return 0;
99 }

 

以上是关于Paper Folding UVA - 177 模拟+思路+找规律的主要内容,如果未能解决你的问题,请参考以下文章

uva10229-模Fibonacci

UVA11029 Leading and Trailing快速模幂+数学

UVa-11582:Colossal Fibonacci Numbers!(模算术)

uva 周期串(求模分组)

hdu 6088 Rikka with Rock-paper-scissors (2017 多校第五场 1004) 组合数学 + 数论 + 模意义下的FFT

NEERC2002 Folding