zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    sqlserver 获取系统用户表结构信息
    Android访问WebService的两种方法
    C# WebService的简单和复杂参数类型和结果的JSON格式
    JQuery的Ajax使用Get,Post方法调用C#WebService并返回数据
    jQuery提交Json数据到Webservice,并接收返回的Json数据
    C#开发的WebService使用JSON格式传递数据+Ajax测试
    Web项目的三层架构和MVC架构异同
    SqlServer更新视图存储过程函数脚本
    SqlServer刷新所有视图
    SqlServer获取表结构语句
  • 原文地址:https://www.cnblogs.com/zcube/p/4194535.html
Copyright © 2011-2022 走看看