• UVA 101 The Blocks Problem(模拟)


            题目不难,就是有点麻烦。会用到栈。

    #include <stdio.h>
    #include <string.h>
    
    struct _r {
        int a[30];
        int x;
    }r[30];
    
    int n;
    
    // 判断a, b是否在同一堆中
    int pos(int a) {
        for (int i=0; i<n; i++) {
            for (int j=0; j<r[i].x; j++) {
                if (a == r[i].a[j])
                    return i;
            }
        }
    }
    int xab(int a) {
        for (int i=0; i<n; i++) {
            for (int j=0; j<r[i].x; j++) {
                if (a == r[i].a[j])
                    return j;
            }
        }
    }
    
    void move_onto(int a, int b, int pa, int pb) {
    
        // 下面两个for循环将a, b堆上面的元素返回原来位置
        for (int i=r[pa].x-1; r[pa].a[i]!=a; i--) {
            r[pa].x--;
            r[r[pa].a[i]].x++;
        }
        for (int i=r[pb].x-1; r[pb].a[i]!=b; i--) {
            r[pb].x--;
            r[r[pb].a[i]].x++;
        }
    
        r[pb].a[r[pb].x] = r[pa].a[r[pa].x-1];
        r[pb].x++;
        r[pa].x--;
    }
    
    void move_over(int a, int b, int pa, int pb) {
    
        for (int i=r[pa].x-1; r[pa].a[i]!=a; i--) {
            r[pa].x--;
            r[r[pa].a[i]].x++;
        }
    
        r[pb].a[r[pb].x] = r[pa].a[r[pa].x-1];
        r[pb].x++;
        r[pa].x--;
    }
    
    void pile_onto(int a, int b, int pa, int pb) {
    
        // 将b上面的元素返回原来的位置
        for (int i=r[pb].x-1; r[pb].a[i]!=b; i--) {
            r[pb].x--;
            r[r[pb].a[i]].x++;
        }
    
        // 将a上面的元素保持到临时栈中
        int tmp_stack[30], top = 0;
        do {
            r[pa].x--;
            tmp_stack[++top] = r[pa].a[r[pa].x];
        } while (r[pa].a[r[pa].x] != a);
    
        while (top) {
            r[pb].a[r[pb].x] = tmp_stack[top];
            top--;
            r[pb].x++;
        }
    }
    
    void pile_over(int a, int b, int pa, int pb) {
    
        // 将a上面的元素保持到临时栈中
        int tmp_stack[30], top = 0;
        do {
            r[pa].x--;
            tmp_stack[++top] = r[pa].a[r[pa].x];
        } while (r[pa].a[r[pa].x] != a);
    
        while (top) {
            r[pb].a[r[pb].x] = tmp_stack[top];
            top--;
            r[pb].x++;
        }
    }
    
    void print() {
        for (int i=0; i<n; i++) {
            printf("%d:", i);
            for (int j=0; j<r[i].x; j++)
                printf(" %d", r[i].a[j]);
            printf("\n");
        }
    }
    
    int main() {
    
        char str1[6], str2[6];
        scanf("%d", &n);
    
        for (int i=0; i<n; i++) {
            r[i].x = 1;
            r[i].a[0] = i;
        }
    
        while (scanf("%s", str1)) {
            if (0 == strcmp(str1, "quit"))
                break;
            int a, b;
            scanf("%d%s%d", &a, str2, &b);
    
            int pa, pb;     // a, b所在哪个堆
            pa = pos(a); pb = pos(b);
            if (pa == pb)
                continue;
    
            if (0==strcmp(str1, "move") && 0==strcmp(str2, "onto")) {
                move_onto(a, b, pa, pb);
            }
            if (0==strcmp(str1, "move") && 0==strcmp(str2, "over")) {
                move_over(a, b, pa, pb);
            }
            if (0==strcmp(str1, "pile") && 0==strcmp(str2, "onto")) {
                pile_onto(a, b, pa, pb);
            }
            if (0==strcmp(str1, "pile") && 0==strcmp(str2, "over")) {
                pile_over(a, b, pa, pb);
            }
            //print();
        }
    
        print();
    
        return 0;
    }
    
  • 相关阅读:
    code3728 联合权值
    Codevs 4600 [NOI2015]程序自动分析
    code1540 银河英雄传说
    code1074 食物链
    堆排序
    哈夫曼树与哈夫曼码
    优先队列用法
    code1154 能量项链
    code1225 八数码Bfs
    javascript5
  • 原文地址:https://www.cnblogs.com/zcube/p/4194535.html
Copyright © 2020-2023  润新知