zoukankan      html  css  js  c++  java
  • Paper Folding UVA

    题目:题目链接

    思路: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 }
  • 相关阅读:
    GDAL并行IO的疑问
    memcpy一段内存到std::vector<double>
    解决mysql无法远程登陆问题
    .net 上传word 转为 html
    OnCheckedChanged的触发需要AutoPostBack="true"
    asp.net与word文档在线
    [转]mysql如何设置主键和外键,实现级联更新、级联删除
    asp.net 读取Word
    datalist 嵌套 datalist 中的table 乱
    [转]php中使用ignore_user_abort()函数后,如何停止后台运行的程序?
  • 原文地址:https://www.cnblogs.com/fan-jiaming/p/9899115.html
Copyright © 2011-2022 走看看