177 - Paper Folding (找规律)

一开始看这题感觉无从下手,甚至一开始根本没理解题意 。后来明白了,是一张纸,每次都是从右向左折叠,注意折叠后不要动 。

折叠完n次后,最底下那一个纸条要保持原位置不动(水平放置),其他的按题目要求展开,从侧面就会看到一条连续的“美丽”曲线 。

那么怎么样找到这条曲线呢? 其实是有规律可循的 。我们把边看作路径,那么行走的方向命令就可以写出了 。 如下:

n = 1 --> ru

n = 2 --> rulu

n = 3 --> rululdlu

n = 4 --> rululdluldrdldlu

其中udlr分别是上下左右 。

发现规律了吧? 没错,每一次都会增加一倍的步数,而且对于增加的那部分,前一半和上一次的相反,后一半相同 。

那么就不难写出了,当然绘制图像还是有点麻烦的,不过我们可以事先将数组开大一点,取中间的一个点为起始点进行绘图 。  当然,需要注意每一行的最大列都需要记录,不然会多输出很多空格,导致WA

细节参见代码:

#include
using namespace std;
int n;
char s[50000][2000]; //开一个足够大的图像
int main() {
    while(~scanf("%d",&n)&&n) {
        memset(s,0,sizeof(s));
        int cnt = 1;
        char buf[50000];//行走命令
        buf[1] = 'r'; buf[2] = 'u'; buf[3] = '\0';
        while(cnt



你可能感兴趣的:(uva解题报告,高效算法)