USTC OJ — 1004 Block world (数据结构stack,简单题)

1. 题目描述

本题描述了一个“机器人”的世界,初始状态如下所示:

现实世界中,机器人没有自主思想,只能接受指令去完成工作。类似地,题目中定义了下面的几种指令:

问题:给定一系列操作指令,计算出“机器人”在完成这些指令之后,“机器人”世界(即Block world)的状态。注意:指令操作结束是使用quit指令来完成。

2. 算法设计

问题很简单,显然需要用stack数据结构表示。

然后只需要把上面的指令描述清楚,模拟各个指令的操作设计出5个API来完成这5个指令即可。

简单地把上面五种机器人指令描述一下:

move a onto b:

  先找到block a和block b所在的block stack,然后把压在a和b上面的所有block还原到初始stack(的栈顶位置)。最后把a弹出,压在b(所在的stack栈顶)上面。

move a over b:

  先找到block a和block b所在的block stack,然后只把a上面的所有block还原到初始stack(的栈顶位置),而b所在的stack不动。最后把a弹出,压在b所在的stack栈顶。

pile a onto b:

  先找到block a和block b所在的block stack,然后只把b上面的所有block还原到出事stack(的栈顶位置),而a所在的stack不动。最后把a以及其上一直到栈顶的所有栈元素,保持相对位置不变,一起被截取然后放到b(所在的stack栈顶)上面。

pile a over b:

  先找到block a和block b所在的block stack,然后直接把a以及其上一直到栈顶的所有栈元素,保持相对位置不便,一起被截取然后放到b(所在的stack栈顶)上面。

quit:

  读到这条指令,算法直接结束。

3. AC Code

  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <stack>
  4 #include <iomanip>
  5 #define N 30
  6 using namespace std;
  7
  8 int block_num;      // 积木数目
  9
 10 int get_block_position(stack<int> block, int a) {
 11     stack<int> q = block;
 12     while(!q.empty()) {
 13         if(a == q.top()) return 1;
 14         q.pop();
 15     }
 16     return 0;
 17 }
 18 void move_onto(stack<int> blocks[], int block_a, int block_b) {
 19    if(block_a == block_b) return;
 20
 21    for(int i = 0; i < block_num; i ++) {
 22        if(get_block_position(blocks[i], block_a)) {
 23            while(!blocks[i].empty() && block_a != blocks[i].top()) {
 24                blocks[blocks[i].top()].push(blocks[i].top());
 25                blocks[i].pop();
 26            }
 27            for(int j = 0; i < block_num; j ++) {
 28                if(get_block_position(blocks[j], block_b)) {
 29                    if(i == j) return;
 30                    while(!blocks[j].empty() && block_b != blocks[j].top()) {
 31                        blocks[blocks[j].top()].push(blocks[j].top());
 32                        blocks[j].pop();
 33                    }
 34                    blocks[j].push(blocks[i].top());
 35                    blocks[i].pop();
 36                    break;
 37                }
 38            }
 39            break;
 40        }
 41    }
 42
 43 }
 44
 45 void move_over(stack<int> blocks[], int block_a, int block_b) {
 46    if(block_a == block_b) return;
 47
 48    for(int i = 0; i < block_num; i ++) {
 49        if(get_block_position(blocks[i], block_a)) {
 50            while(!blocks[i].empty() && block_a != blocks[i].top()) {
 51                blocks[blocks[i].top()].push(blocks[i].top());
 52                blocks[i].pop();
 53            }
 54            for(int j = 0; i < block_num; j ++) {
 55                if(get_block_position(blocks[j], block_b)) {
 56                    if(i == j) return;
 57                    blocks[j].push(blocks[i].top());
 58                    blocks[i].pop();
 59                    break;
 60                }
 61            }
 62            break;
 63        }
 64    }
 65 }
 66
 67 void pile_onto(stack<int> blocks[], int block_a, int block_b) {
 68    if(block_a == block_b) return;
 69
 70    for(int i = 0; i < block_num; i ++) {
 71        if(get_block_position(blocks[i], block_b)) {
 72            while(!blocks[i].empty() && block_b != blocks[i].top()) {
 73                blocks[blocks[i].top()].push(blocks[i].top());
 74                blocks[i].pop();
 75            }
 76            for(int j = 0; i < block_num; j ++) {
 77                if(get_block_position(blocks[j], block_a)) {
 78                    if(i == j) return;
 79                    stack<int> q;
 80                    while(!blocks[i].empty() && block_a != blocks[j].top()) {
 81                        q.push(blocks[j].top());
 82                        blocks[j].pop();
 83                    }
 84                    q.push(blocks[j].top());
 85                    blocks[j].pop();
 86
 87                    while(!q.empty()) {
 88                        blocks[i].push(q.top());
 89                        q.pop();
 90                    }
 91                    break;
 92                }
 93            }
 94            break;
 95        }
 96    }
 97 }
 98
 99 void pile_over(stack<int> blocks[],int block_a, int block_b) {
100    if(block_a == block_b) return;
101
102    for(int i = 0; i < block_num; i ++) {
103        if(get_block_position(blocks[i], block_b)) {
104
105            for(int j = 0; i < block_num; j ++) {
106                if(get_block_position(blocks[j], block_a)) {
107                    if(i == j) return;
108                    stack<int> q;
109                    while(!blocks[i].empty() && block_a != blocks[j].top()) {
110                        q.push(blocks[j].top());
111                        blocks[j].pop();
112                    }
113                    q.push(blocks[j].top());
114                    blocks[j].pop();
115
116                    while(!q.empty()) {
117                        blocks[i].push(q.top());
118                        q.pop();
119                    }
120                    break;
121                }
122            }
123            break;
124        }
125    }
126 }
127
128 void output(stack<int> blocks[]) {
129      for(int i = 0; i < block_num; i ++) {
130          cout <<setw(2)<< i << ": ";
131          stack<int> q;
132          while(!blocks[i].empty()) {
133              q.push(blocks[i].top());
134              blocks[i].pop();
135          }
136          while(!q.empty()) {
137              cout << " ";
138              cout << q.top();
139              q.pop();
140          }
141          cout <<  endl;
142      }
143 }
144 int main() {
145
146     string commend_1;     // 命令
147     string commend_2;
148     int block_a;
149     int block_b;
150     // freopen("in.txt", "r", stdin);
151     cin >> block_num;
152     stack<int> blocks[N];
153
154
155     for(int i = 0; i < block_num; i ++) {
156         blocks[i].push(i);
157     }
158
159     while(cin >> commend_1 && commend_1 != "quit") {
160        if(commend_1 == "move") {
161            cin >> block_a;
162            cin >> commend_2;
163            if(commend_2 == "onto")  {
164                cin >> block_b;
165                move_onto(blocks, block_a, block_b);
166            }else if(commend_2 == "over"){
167                cin >> block_b;
168                move_over(blocks, block_a, block_b);
169            }
170        }else if(commend_1 == "pile") {
171            cin >> block_a;
172            cin >> commend_2;
173            if(commend_2 == "onto")  {
174                cin >> block_b;
175                pile_onto(blocks, block_a, block_b);
176            }else if(commend_2 == "over"){
177                cin >> block_b;
178                pile_over(blocks,block_a, block_b);
179            }
180        }
181     }
182
183     output(blocks);
184     return 0;
185 }

时间: 2024-08-29 18:13:53

USTC OJ — 1004 Block world (数据结构stack,简单题)的相关文章

USTC OJ — 1003 Fibonacci Numbers(组合数学, 简单题)

1. 题目描述 Fibonacci数列定义为: A0 = 0, A1 = 1; An = An-1 + An-2, if n >= 2. 问题:输入一个n( 0 ≤ n ≤ 40 ),计算An. 2. 算法设计 直接利用公式计算即可,时间复杂度O(N),由于数据规模很小,可以选择 先打表,然后对每一个测试数据n,直接输出An: 或者分别对每一个n,计算An. 3. AC Code 1 #include <stdio.h> 2 #define N 41 3 int f[N]; 4 void

(hdu 简单题 128道)Lowest Bit(求一个数的二进制的最后一个非零位对应的十进制数)

题目: Lowest Bit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8722    Accepted Submission(s): 6428 Problem Description Given an positive integer A (1 <= A <= 100), output the lowest bit of A.

C++与数据结构 -- stack实现表达式求值[注释版]

有好多朋友评论以前的那篇博文说:代码中间没有注释.由于课程一直比较紧张,所以答应的注释直到今天才写, 发表出来,与大家共享! #include <map> #include <stack> #include <string> #include <iostream> #include <fstream> using namespace std; //为+,-,*,/运算符 设定优先级 map<char,int> priority; vo

北方多校 又是一道简单题

又是一道简单题 12000ms 65536K 给出一棵有根树,每次查询给出两个节点 u 和 v,假设节点 f 是u,v的最近公共祖先,请查询以 f 为根的子树中,不在 u 到 v 这条链上且标号最小的节点. 输入格式 第一行输入正整数 T(T <= 30),表示共有T组输入数据. 对于每组数据,第一行输入两个正整数 n,m(n <= 50000,m <= 50000),表示节点数和询问数,节点编号 1 到 n,其中 1 是根节点. 接下来 n - 1 行,每行输入两个正整数u,v,表示标

NYOJ 663 弟弟的作业【简单题更能体现水平。。。】

弟弟的作业 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 你的弟弟刚做完了"100以内数的加减法"这部分的作业,请你帮他检查一下.每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过100的非负整数:c是弟弟算出的答案,可能是不超过200的非负整数,也可能是单个字符"?",表示他不会算. 输入 输入文件包含不超过100行,以文件结束符结尾.每行包含一道题目,格式保证符合上述规定,且不包含任何

大公司面试经典数据结构与算法题C#解答

几个大公司(IBM.MicroSoft and so on)面试经典数据结构与算法题C#解答 1.链表反转 我想到了两种比较简单的方法 第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表中(也就是原链表第一个元素被插入成新链表的最后一个元素). 第二种是不需要开新的链表,而是逐步反转原链表中元素的指向,例如: 原链表是 1->2->3->4->null  被  逐步修改为 ①2->1->null.3->4->null ②3->2->

hdu 4970 Killing Monsters(简单题) 2014多校训练第9场

Killing Monsters                                                                        Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description Kingdom Rush is a popular TD game, in which you should b

nyist oj 311 完全背包 (动态规划经典题)

完全背包 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的体积是c,价值是w.求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大.本题要求是背包恰好装满背包时,求出最大价值总和是多少.如果不能恰好装满背包,输出NO 输入 第一行: N 表示有多少组测试数据(N<7). 接下来每组测试数据的第一行有两个整数M,V. M表示物品种类的数目,V表示背包的总容

简单题

原题http://acm.hdu.edu.cn/showproblem.php?pid=4950 Monster Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 566    Accepted Submission(s): 231 Problem Description Teacher Mai has a kingdom. A mons