首页 > 代码库 > USTC OJ — 1004 Block world (数据结构stack,简单题)

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 }
View Code

 

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