[uva] 101 - The Blocks Problem

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=37

纯模拟, 要先考虑好用什么数据结构能方便的支持模拟中的各种操作, 我选择的是链表, 于是直接用的STL的List, STL真是很实用, 点赞.

  1 #include <cstdio>
  2 #include <list>
  3 #include <vector>
  4 #include <map>
  5 #include <string>
  6 #include <cstring>
  7 #include <algorithm>
  8 using namespace std;
  9 
 10 #define MAX_LEN 255
 11 int n = 0;
 12 vector<list<int> > vec;
 13 map<int, int> ma;
 14 
 15 void resetListByBlockNum(int blockNum) {
 16     list<int>& l = vec[ma[blockNum]];
 17     list<int>::iterator itStart = find(l.begin(), l.end(), blockNum);
 18     if (itStart == l.end()) {
 19         return;
 20     }
 21     itStart++;
 22     list<int>::iterator it = itStart;
 23     for (; it != l.end();) {
 24         ma[*it] = *it;
 25         vec[*it].push_back(*it);
 26         it = l.erase(it);
 27     }
 28 }
 29 
 30 void moveSubListByBlockNum(int a, int b) {
 31     list<int>& la = vec[ma[a]];
 32     list<int>& lb = vec[ma[b]];
 33     list<int>::iterator itaStart = find(la.begin(), la.end(), a);
 34     list<int>::iterator ita = itaStart;
 35     for (; ita != la.end();) {
 36         ma[*ita] = ma[b];
 37         lb.push_back(*ita);
 38         ita = la.erase(ita);
 39     }
 40 }
 41 
 42 void processCmd(string m1, string m2, int a, int b) {
 43     list<int>& la = vec[ma[a]];
 44     list<int>& lb = vec[ma[b]];
 45     if (a == b || ma[a] == ma[b] || la.empty()) {
 46         return;
 47     }
 48     if (m1 == "move" && m2 == "onto") {
 49         resetListByBlockNum(a);
 50         la.pop_back();
 51         resetListByBlockNum(b);
 52         lb.push_back(a);
 53         ma[a] = ma[b];
 54     } else if (m1 == "move" && m2 == "over") {
 55         resetListByBlockNum(a);
 56         la.pop_back();
 57         lb.push_back(a);
 58         ma[a] = ma[b];
 59     } else if (m1 == "pile" && m2 == "onto") {
 60         resetListByBlockNum(b);
 61         moveSubListByBlockNum(a, b);
 62     } else if (m1 == "pile" && m2 == "over") {
 63         moveSubListByBlockNum(a, b);
 64     } else {
 65         printf("CMD_ERROR\n");
 66         return;
 67     }
 68 }
 69 
 70 void printResult() {
 71     for (unsigned int i = 0; i < n; ++i) {
 72         printf("%d:", i);
 73         list<int>& l = vec[i];
 74         list<int>::iterator it;
 75         for (it = l.begin(); it != l.end(); ++it) {
 76             printf(" %d", *it);
 77         }
 78         printf("\n");
 79     }
 80 }
 81 
 82 int main(int argc, const char * argv[])
 83 {
 84     scanf("%d", &n);
 85     vec.clear();
 86     for (int i = 0; i < n; ++i) {
 87         list<int> l(1,i);
 88         vec.push_back(l);
 89         ma[i] = i;
 90     }
 91     while (true) {
 92         char m1[MAX_LEN] = {0};
 93         char m2[MAX_LEN] = {0};
 94         int a = 0, b = 0;
 95         scanf("%s", m1);
 96         if (strcmp(m1, "quit") == 0) {
 97             break;
 98         }
 99         scanf(" %d %s %d", &a, m2, &b);
100         processCmd(m1, m2, a, b);
101     }
102     printResult();
103     return 0;
104 }

 

posted @ 2013-12-15 15:35  NextLife  阅读(278)  评论(0)    收藏  举报