• 紫书 习题8-5 UVa 177 (找规律)


    参考了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] = '';
    		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] = '';
    		}
    		
    		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;	
    } 

  • 相关阅读:
    【Linux】【Chrome】安装Chrome浏览器的攻略
    ubuntu下安装程序的三种方法
    scala学习笔记
    安装scala
    安装java
    Python学习笔记
    Linux安装python
    软件测试笔记
    Linux安装微信
    PUTTY学习
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819577.html
Copyright © 2020-2023  润新知