Advertisement
Guest User

Untitled

a guest
May 25th, 2015
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.91 KB | None | 0 0
  1. //Daniel Grzegorzewski
  2. #include <bits/stdc++.h>
  3.  
  4. #define MP make_pair
  5. #define PB push_back
  6. #define ST first
  7. #define ND second
  8.  
  9. using namespace std;
  10.  
  11. typedef pair<int, int> PII;
  12. typedef vector<int> VI;
  13. typedef vector<PII> VII;
  14.  
  15. void init_ios()
  16. {
  17.      ios_base::sync_with_stdio(0);
  18.      cin.tie(0);
  19. }
  20.  
  21. const int INF = (int)1e9;
  22. const int N = (int)1e6 + 10;
  23.  
  24. int n, m, c;
  25. int res = INF;
  26. int t, id_pyl[N];
  27. bool vis[N], pylek[N], vis_pyl[N], wygrany_pyl[N];
  28. VI dzieci[N];
  29.  
  30. struct Node
  31. {
  32.     VI child;
  33.     int r;  //1 wolne, 2 - zajete
  34. } w[N];
  35.  
  36. void jebaj_pylek(int i)
  37. {
  38.     if (pylek[i])
  39.         return;
  40.     pylek[i] = true;
  41.     id_pyl[i] = t;
  42.     if (i >= m*n-m)
  43.         wygrany_pyl[t] = true;
  44.     if (i+m < m*n && w[i+m].r == 1)
  45.         jebaj_pylek(i+m);
  46.     if (i+m < m*n && w[i+m].r == 0)
  47.         dzieci[t].PB(i+m);
  48.     if (i+m-1 < m*n && i%m != 0 && w[i+m-1].r == 1)
  49.         jebaj_pylek(i+m-1);
  50.     if (i+m-1 < m*n && i%m != 0 && w[i+m-1].r == 0)
  51.         dzieci[t].PB(i+m-1);
  52.     if (i >= m && i%m != 0 && w[i-1].r == 1)
  53.         jebaj_pylek(i-1);
  54.     if (i >= m && i%m != 0 && w[i-1].r == 0)
  55.         dzieci[t].PB(i-1);
  56.     if (i >= m && (i+1)%m != 0 && i+1 < m*n && w[i+1].r == 1)
  57.         jebaj_pylek(i+1);
  58.     if (i >= m && (i+1)%m != 0 && i+1 < m*n && w[i+1].r == 0)
  59.         dzieci[t].PB(i+1);
  60.     if (i >= m && w[i-m].r == 1)
  61.         jebaj_pylek(i-m);
  62.     if (i >= m && w[i-m].r == 0)
  63.         dzieci[t].PB(i-m);
  64.     if (i >= m && (i+1)%m != 0 && w[i-m+1].r == 1)
  65.         jebaj_pylek(i-m+1);
  66.     if (i >= m && (i+1)%m != 0 && w[i-m+1].r == 0)
  67.         dzieci[t].PB(i-m+1);
  68. }
  69.  
  70. void jebaj(int i)
  71. {
  72.     if (pylek[i])
  73.         return;
  74.     jebaj_pylek(i);
  75.     ++t;
  76. }
  77.  
  78. queue<PII> q;
  79.  
  80. int main()
  81. {
  82.     init_ios();
  83.     cin >> m >> n >> c;
  84.     for (int i = 1; i <= c; ++i) {
  85.         int x, y;
  86.         char r;
  87.         cin >> y >> x >> r;
  88.         --x;
  89.         --y;
  90.         if (r == 'o')
  91.             w[m*x+y].r = 1;
  92.         else
  93.             w[m*x+y].r = 2;
  94.     }
  95.  
  96.     for (int i = 0; i < m*n; ++i) {
  97.         if (w[i].r == 2)
  98.             continue;
  99.         if (w[i].r == 1) {
  100.             jebaj(i);
  101.             continue;
  102.         }
  103.         if (i+m < m*n)
  104.             w[i].child.PB(i+m);
  105.         if (i+m-1 < m*n && i%m != 0)
  106.             w[i].child.PB(i+m-1);
  107.         if (i >= m && i%m != 0)
  108.             w[i].child.PB(i-1);
  109.         if (i >= m && (i+1)%m != 0 && i+1 < m*n)
  110.             w[i].child.PB(i+1);
  111.         if (i >= m)
  112.             w[i].child.PB(i-m);
  113.         if (i >= m && (i+1)%m != 0)
  114.             w[i].child.PB(i-m+1);
  115.     }
  116.     for (int i = 0; i < m; ++i) {
  117.         if (w[i].r == 2)
  118.             continue;
  119.         if (w[i].r == 1) {
  120.             if (wygrany_pyl[id_pyl[i]]) {
  121.                 cout<<"0\n";
  122.                 return 0;
  123.             }
  124.             for (int j = 0; j < dzieci[id_pyl[i]].size(); ++j) {
  125.                 if (vis[dzieci[id_pyl[i]][j]])
  126.                     continue;
  127.                 vis[dzieci[id_pyl[i]][j]] = true;
  128.                 q.push(MP(dzieci[id_pyl[i]][j], 1));
  129.             }
  130.             vis_pyl[id_pyl[i]] = vis[i] = true;
  131.         }
  132.     }
  133.     for (int i = 0; i < m; ++i)
  134.         if (w[i].r == 0 && !vis[i]) {
  135.             vis[i] = true;
  136.             q.push(MP(i, 1));
  137.         }
  138.    
  139.     while (!q.empty()) {
  140.         PII x = q.front();
  141.         q.pop();
  142.         if (x.ST >= n*m-m) {
  143.             cout<<x.ND<<"\n";
  144.             return 0;
  145.         }
  146.         for (int i = 0; i < w[x.ST].child.size(); ++i) {
  147.             if (vis[w[x.ST].child[i]])
  148.                 continue;
  149.             if (pylek[w[x.ST].child[i]]) {
  150.                 if (wygrany_pyl[id_pyl[w[x.ST].child[i]]]) {
  151.                     cout<<x.ND<<"\n";
  152.                     return 0;
  153.                 }
  154.                 if (vis_pyl[id_pyl[w[x.ST].child[i]]])
  155.                     continue;
  156.                 else {
  157.                     vis_pyl[id_pyl[w[x.ST].child[i]]] = true;
  158.                     for (int j = 0; j < dzieci[id_pyl[w[x.ST].child[i]]].size(); ++j) {
  159.                         if (vis[dzieci[id_pyl[w[x.ST].child[i]]][j]])
  160.                             continue;
  161.                         vis[dzieci[id_pyl[w[x.ST].child[i]]][j]] = true;
  162.                         q.push(MP(dzieci[id_pyl[w[x.ST].child[i]]][j], x.ND+1));
  163.                     }
  164.                 }
  165.             }
  166.             else {
  167.                 vis[w[x.ST].child[i]] = true;
  168.                 q.push(MP(w[x.ST].child[i], x.ND+1));
  169.             }
  170.         }
  171.     }
  172.     cout<<"-1\n";
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement