标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 5397 | Accepted: 2312 |
Description
Input
Output
Sample Input
10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit
Sample Output
0: 0 1: 1 9 2 4 2: 3: 3 4: 5: 5 8 7 6 6: 7: 8: 9:
Source
1 #include <cstdio> 2 #include <vector> 3 using namespace std; 4 5 int n, a, b; 6 char op1[5], op2[5]; 7 vector<int> v[30]; 8 9 //找到所在积木的位置及高度 10 void findBlock(int a, int& p, int& h) 11 { 12 for(p = 0; p < n; ++p) 13 for(h = 0; h < (int)v[p].size(); ++h) 14 if(v[p][h] == a) 15 return; 16 } 17 18 //清除位置p上高度h以上的积木 19 void clearAbove(int p, int h) 20 { 21 for(size_t i = h+1; i < v[p].size(); ++i){ 22 int tmp = v[p][i]; 23 v[tmp].push_back(tmp); 24 } 25 v[p].resize(h+1); 26 } 27 28 //移动位置p上高度h及以上的积木到位置p2上 29 void moveBlock(int p, int h, int p2) 30 { 31 for(size_t i = h; i < v[p].size(); ++i) 32 v[p2].push_back(v[p][i]); 33 v[p].resize(h); 34 } 35 36 int main() 37 { 38 scanf("%d", &n); 39 for(int i = 0; i < n; ++i) 40 v[i].push_back(i); 41 while(scanf("%s", op1), op1[0] != ‘q‘){ 42 scanf("%d%s%d", &a, op2, &b); 43 int pa, pb, ha, hb; 44 findBlock(a, pa, ha); 45 findBlock(b, pb, hb); 46 if(pa == pb) 47 continue; 48 if(op1[0] == ‘m‘) 49 clearAbove(pa, ha); 50 if(op2[1] == ‘n‘) 51 clearAbove(pb, hb); 52 moveBlock(pa, ha, pb); 53 } 54 for(int i = 0; i < n; ++i){ 55 printf("%d:", i); 56 for(size_t j = 0; j < v[i].size(); ++j) 57 printf(" %d", v[i][j]); 58 printf("\n"); 59 } 60 return 0; 61 }
标签:
原文地址:http://www.cnblogs.com/inmoonlight/p/5701425.html