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] = ‘