码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-12-12 12:59:27      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   使用   sp   

1. 题目描述

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

 

bubuko.com,布布扣

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

bubuko.com,布布扣

 

问题:给定一系列操作指令,计算出“机器人”在完成这些指令之后,“机器人”世界(即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

bubuko.com,布布扣
  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,简单题)

标签:style   blog   http   io   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/nuppt/p/4159405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!