uva101-木块问题

此题为小白书里数据结构基础的线性表训练

翻译请戳 http://luckycat.kshs.kh.edu.tw/

解题思路

开个二维数组模拟整个过程就行了。

注意题目中提到的不理会的情况。测试数据不会很刁难。

这个模拟还是挺烦的。。。

代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int MAX_LEN = 25;
typedef struct pos {
    int x, y;
}npos;
int nBlock;
int stack[MAX_LEN][MAX_LEN];
npos found(int index)
{
    for(int i=0; i<nBlock; i++) {
        for(int j=0; j<MAX_LEN; j++)
            if(stack[i][j] == index) {
                npos temp;
                temp.x = i; temp.y = j;
                return temp;
            }
            else if(stack[i][j] == -1) break;
    }
}
int count(int index)
{
    npos now = found(index);
    int count = 0;
    for(int j=now.y+1; stack[now.x][j]>=0; j++,count++);
    return count;
}
void initPos(int index)
{
    npos now = found(index);
 //   int sum = count(index);
    for(int j=now.y+1; stack[now.x][j]>=0; j++) {
        int temp = stack[now.x][j];
        stack[temp][0] = temp;
        stack[now.x][j] = -1;
    }
}
int main()
{
    while(scanf("%d", &nBlock) == 1) {
        char order[20];
        int a, b;
        memset(stack, -1, sizeof(stack));
        for(int i=0; i<nBlock; i++) stack[i][0] = i;
        getchar();
        gets(order);
        while(strstr(order, "quit") == NULL) {
            if(strstr(order, "move")!=NULL && strstr(order, "onto")!=NULL) {
                sscanf(order, "move %d onto %d", &a, &b);
            //    initPos(a); initPos(b);
                npos temp1 = found(b);
                npos temp2 = found(a);
                if(temp1.x != temp2.x) { initPos(a);initPos(b); }
                if(temp1.x != temp2.x) {
                    stack[temp1.x][temp1.y+1] = a;
                    stack[temp2.x][temp2.y] = -1;
                }
            }
            if(strstr(order, "move")!=NULL && strstr(order, "over")!=NULL) {
                sscanf(order, "move %d over %d", &a, &b);
            //    initPos(a);
                int temp = count(b);
                npos tempPos = found(b);
                npos tempa = found(a);
                if(tempPos.x != tempa.x) initPos(a);
                if(tempPos.x != tempa.x) {
                    stack[tempPos.x][tempPos.y+temp+1] = a;
                    stack[tempa.x][tempa.y] = -1;
                }
            }
            if(strstr(order, "pile")!=NULL && strstr(order, "onto")!=NULL) {
                sscanf(order, "pile %d onto %d", &a, &b);
            //    initPos(b);
            //  int temp = count(a);
                npos tempa = found(a);
                npos tempb = found(b);
                if(tempa.x != tempb.x) initPos(b);
                int i, j;
                for(j=tempa.y,i=tempb.y+1; tempa.x != tempb.x&&stack[tempa.x][j]>=0; j++,i++) {
                    stack[tempb.x][i] = stack[tempa.x][j];
                    stack[tempa.x][j] = -1;
                }
            }
            if(strstr(order, "pile")!=NULL && strstr(order, "over")!=NULL) {
                sscanf(order, "pile %d over %d", &a, &b);
                int countb = count(b);
            //  int countb = count(b);
                npos tempa = found(a);
                npos tempb = found(b);
                int i, j;
                for(j=tempa.y,i=tempb.y+countb+1; tempa.x != tempb.x && stack[tempa.x][j]>=0; j++,i++) {
                    stack[tempb.x][i] = stack[tempa.x][j];
                    stack[tempa.x][j] = -1;
                }
            }
            gets(order);
        }
        for(int i=0; i<nBlock; i++) {
            int j = 0;
            cout << i << ":";
            while(stack[i][j]>=0) {
                cout << " " << stack[i][j]; j++;
            }
            if(i != nBlock) cout << endl;
        }
    }
    return 0;
}
时间: 2024-10-17 06:26:39

uva101-木块问题的相关文章

uva101木块问题The Blocks Problem

背景:一看这道题,再看书前面的知识点,我只能说一点不会,于是我将上面的代码在电脑上面打了一遍,这才会一点点新知识的运用,然后我就按照自己的想法,说实话已经参照了书上的一些东西,然后自己去用新知识写代码,当我满心欢喜的去测试的时候,啊,wrong,仔细一读题,才发现自己题意都理解错了. 思路:模拟四条指令即可.由于每个木块堆的高度不确定,所以用vector来保存很合适. 学习:vector就是一个不定长数组.若a是一个vector,可以用a.size()读取他的大小,用a.resize()改变他的

UVA101 HDU1612 POJ1208 The Blocks Problem

问题链接:UVA101 HDU1612 POJ1208 The Blocks Problem. 这是一个模拟题,程序过程都是套路. 程序中用到了STL的容器类vector. 这个程序在UVA和POJ中都AC,可是在HDU中是"Presentation Error". AC通过的C++语言程序如下: /* UVA101 HDU1612 POJ1208 The Blocks Problem */ #include <iostream> #include <string&g

c++ 木块问题

/*Sample Input输入示例 10move 9 onto 1move 8 over 1move 7 over 1move 6 over 1pile 8 over 6pile 8 over 5move 2 over 1move 4 over 9quit Sample Output输出示例 0: 01: 1 9 2 42:3: 34:5: 5 8 7 66:7:8:9: */ #include<cstdio>#include<string>#include<vector&

数数小木块

描述 在墙角堆放着一堆完全相同的正方体小木块,如下图所示: 因为木块堆得实在是太有规律了,你只要知道它的层数就可以计算所有木块的数量了. 现在请你写个程序 给你任一堆木块的层数,求出这堆木块的数量. 输入 第一行是一个整数N(N<=10)表示测试数据的组数) 接下来的n行 每行只有一个整数 ,表示这堆小木块的层数, 输出 对应每个输入的层数有一个输出,表示这堆小木块的总数量,每个输出占一行 样例输入 2 1 5 样例输出 1 35 1 #include <stdio.h> 2 3 int

UVA101 The Blocks Problem

 The Blocks Problem  Background Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an early AIstudy of planning and robotics (STRIPS) used a block world in which arobot arm performed ta

ACM-数数小木块

描述 在墙角堆放着一堆完全相同的正方体小木块,如下图所示: 因为木块堆得实在是太有规律了,你只要知道它的层数就可以计算所有木块的数量了. 现在请你写个程序 给你任一堆木块的层数,求出这堆木块的数量. 输入 第一行是一个整数N(N<=10)表示测试数据的组数) 接下来的n行 每行只有一个整数 ,表示这堆小木块的层数, 输出 对应每个输入的层数有一个输出,表示这堆小木块的总数量,每个输出占一行 样例输入 2 1 5 样例输出 1 35 代码: #include<iostream> using

保冷木块/保冷支承块

J8保冷木块/J8管托 J9管托保冷红松木块主要用于输送低温介质的管道,如果不用特殊材料在外面进行保护,13785583922那么输送期间冷量会大量损失,造成输送失败,所以对于低温输送管道要用特殊材料进行保冷,一般现在流行用红松木块包裹管道保冷13785583922,另外保冷木块管道的支撑管托也要用红松木块.这样保冷木块低温管道在输送过程中冷量就不会损失太多.采用先进的生产设备,根据国家石油和化学工业局实施发布的标准管架图HG/T21629-1999,使用于冶金.石油.化工.车辆.船舶.电力等机

木块问题 The Blocks Problem, UVa 101

题目 从左到右有n个木块,编号为0~n-1的木块,要求模拟以下4种操作(下面的a和b都是木块编号): 1.move a onto b:把木块a.b上的木块放回各自的原位,再把a放到b上: 2.move a over b:把a上的木块放回各自的原位,再把a发到含b的堆上: 3.pile a onto b:把b上的木块放回各自的原位,再把a连同a上的木块移到b上: 4.pile a over b:把a连同a上木块移到含b的堆上. 当输入quit时,结束操作并输出0~n-1的位置上的木块列表,按照从底

nyoj 260-数数小木块 (打表)

260-数数小木块 内存限制:64MB 时间限制:3000ms 特判: No 通过数:17 提交数:24 难度:1 题目描述: 在墙角堆放着一堆完全相同的正方体小木块,如下图所示: 因为木块堆得实在是太有规律了,你只要知道它的层数就可以计算所有木块的数量了. 现在请你写个程序 给你任一堆木块的层数,求出这堆木块的数量. 输入描述: 第一行是一个整数N(N<=10)表示测试数据的组数) 接下来的n行 每行只有一个整数 ,表示这堆小木块的层数, 输出描述: 对应每个输入的层数有一个输出,表示这堆小木

UVa101

The Blocks Problem Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 101 uDebug Description Background Many areas of Computer Science use simple, abstract domains for both analytical and empirical studi