Advertisement
royalsflush

Referência para 101 (Luiza)

Mar 1st, 2012
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <vector>
  3. #include <string.h>
  4. using namespace std;
  5.  
  6. int n;
  7. int a,b;
  8. char prim[128];
  9. char sec[128];
  10. vector<int> blocks[30];
  11.  
  12. pair<int,int> findBlock(int x) {
  13.     for (int i=0; i<n; i++)
  14.         for (int j=0; j<blocks[i].size(); j++)
  15.             if (blocks[i][j]==x)
  16.                 return make_pair(i,j);
  17. }
  18.  
  19. int returnToOrig(int x) {
  20.     pair<int, int> px = findBlock(x);
  21.  
  22.     while (blocks[px.first].back()!=x) {
  23.         int tmp = blocks[px.first].back();
  24.         blocks[px.first].pop_back();
  25.         blocks[tmp].push_back(tmp);
  26.     }
  27.  
  28.     return px.first;
  29. }
  30.  
  31. vector<int> getPile(int x) {
  32.     pair<int, int> px = findBlock(x);
  33.  
  34.     vector<int> pile(blocks[px.first].begin()+px.second,
  35.         blocks[px.first].end());
  36.  
  37.     while (blocks[px.first].back()!=x) blocks[px.first].pop_back();
  38.     blocks[px.first].pop_back();   
  39.  
  40.     return pile;
  41. }
  42.  
  43. void printBlocks() {
  44.     for (int i=0; i<n; i++) {
  45.         printf("%d:", i);
  46.        
  47.         for (int j=0; j<blocks[i].size(); j++)
  48.             printf(" %d", blocks[i][j]);
  49.         printf("\n");
  50.     }
  51. }
  52.  
  53. int main() {
  54.     scanf("%d", &n);
  55.  
  56.     for (int i=0; i<n; i++)
  57.         blocks[i].push_back(i);
  58.  
  59.     while (1) {
  60.         scanf(" %s", prim);
  61.         if (!strcmp(prim,"quit")) break;
  62.  
  63.         scanf("%d %s %d", &a,sec,&b);
  64.  
  65.         if (a==b) continue;
  66.         if (findBlock(a).first==findBlock(b).first)
  67.             continue;
  68.  
  69.         vector<int> toB;
  70.  
  71.         if (!strcmp(prim, "move")) {
  72.             int pa = returnToOrig(a);          
  73.             toB.push_back(a);
  74.             blocks[pa].pop_back();
  75.         }
  76.         else toB = getPile(a);
  77.  
  78.         if (!strcmp(sec, "onto"))
  79.             returnToOrig(b);
  80.  
  81.         int it = findBlock(b).first;
  82.    
  83.         for (int i=0; i<toB.size(); i++)
  84.             blocks[it].push_back(toB[i]);
  85.     }
  86.  
  87.     printBlocks();
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement