uva 177:Paper Folding(模拟 Grade D)

题目链接

题意:一张纸,每次从右往左对折。折好以后打开,让每个折痕都自然的呈90度。输出形状。

思路:模拟折……每次折想象成把一张纸分成了正面在下的一张和反面在上的一张。维护左边和方向,然后输出。细节有点多。

代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

#define N (1<<13)+10

struct Paper{
    int l, r;
    bool isFace;
    Paper(){}
    Paper(int _l, int _r, bool is) : l(_l), r(_r), isFace(is){}
}paper[N];

int data[N];

int pp;

void flod(Paper &now) {
    int mid = (now.l+now.r)/2;
    data[mid] = now.isFace?1:-1;
    //printf("%d %c %d\n", now.l, "^v"[data[mid]==1], now.r);
    if( now.isFace ) {
        paper[pp++] = Paper(mid,now.r,!now.isFace);
        now.r = mid;
    } else {
        paper[pp++] = Paper(mid,now.r,now.isFace);
        now.r = mid;
        now.isFace = !now.isFace;
    }

}

struct Point{
    int x,y;
    int way;
    Point(int x=0, int y=0, int way=-1):x(x),y(y),way(way){}
}point[N];

enum{
    R,U,L,D
};

char mat[2000][2000];
void showGraph(int end) {
    point[0] = Point(0,0,R);
    //printf("%d,%d,%c\n",0,0,"RULD"[R]);
    int lmost = 0;
    int umost = 0;
    int rmost = 0;
    int dmost = 0;
    for (int i = 1; i < end; i++) {
        int way = (point[i-1].way+data[i]+4)%4;
        int x = point[i-1].x;
        int y = point[i-1].y;

        // 细节:找出现在的位置
        switch(point[i-1].way) {
            case R: y += 1; break;
            case L: y -= 1; break;
            case U: x -= 1; break;
            case D: break;
        }
        switch (way) {
            case R: y += 1; break;
            case L: y -= 1; break;
            case U: break;
            case D: x += 1; break;
        }
            
        point[i] = Point(x, y, way);

        //printf("%d,%d,%c\n",x,y,"RULD"[way]);

        umost = min(umost, x);
        dmost = max(dmost, x);

        lmost = min(lmost, y);
        rmost = max(rmost, y);
    }
    //printf("   %d \n%d   %d\n   %d\n", umost, lmost, rmost, dmost);
    memset(mat, ' ', sizeof(mat));
    for (int i = 0; i < end; i++) {
        mat[point[i].x-umost][point[i].y-lmost] = (point[i].way == L || point[i].way == R)?'_':'|';
    }
    dmost = dmost - umost;
    rmost = rmost - lmost;
    for (int i = 0; i <= dmost; i++) {
        mat[i][rmost+1] = 0;
        int p = rmost;
        while (mat[i][p] == ' ') mat[i][p--] = 0;
        printf("%s\n", mat[i]);
    }
    puts("^");
    //printf("   %d \n%d   %d\n   %d\n", umost, lmost, rmost, dmost);
}

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        if (n == 0) break;
        pp = 0;
        paper[pp++] = Paper(0,1<<n,true);

        memset(data, -1, sizeof(data));
        for (int i = 0; i < n; i++) {
            int nowpp = pp;
            for (int j = 0; j < nowpp; j++) {
                flod(paper[j]);
            }
        }

        //for (int i = 1; i < (1<<n); i++) {
        //    printf("%c ", "^v"[data[i]==1]);
        //}puts("");

        showGraph(1<<n);
    }
    return 0;
}

 

posted on 2014-09-25 23:09  ShineCheng  阅读(410)  评论(0编辑  收藏  举报

导航