Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Daniel Grzegorzewski
- #include <bits/stdc++.h>
- #define MP make_pair
- #define PB push_back
- #define ST first
- #define ND second
- using namespace std;
- typedef pair<int, int> PII;
- typedef vector<int> VI;
- typedef vector<PII> VII;
- void init_ios()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- }
- const int INF = (int)1e9;
- const int N = (int)1e6 + 10;
- int n, m, c;
- int res = INF;
- int t, id_pyl[N];
- bool vis[N], pylek[N], vis_pyl[N], wygrany_pyl[N];
- VI dzieci[N];
- struct Node
- {
- VI child;
- int r; //1 wolne, 2 - zajete
- } w[N];
- void jebaj_pylek(int i)
- {
- if (pylek[i])
- return;
- pylek[i] = true;
- id_pyl[i] = t;
- if (i >= m*n-m)
- wygrany_pyl[t] = true;
- if (i+m < m*n && w[i+m].r == 1)
- jebaj_pylek(i+m);
- if (i+m < m*n && w[i+m].r == 0)
- dzieci[t].PB(i+m);
- if (i+m-1 < m*n && i%m != 0 && w[i+m-1].r == 1)
- jebaj_pylek(i+m-1);
- if (i+m-1 < m*n && i%m != 0 && w[i+m-1].r == 0)
- dzieci[t].PB(i+m-1);
- if (i >= m && i%m != 0 && w[i-1].r == 1)
- jebaj_pylek(i-1);
- if (i >= m && i%m != 0 && w[i-1].r == 0)
- dzieci[t].PB(i-1);
- if (i >= m && (i+1)%m != 0 && i+1 < m*n && w[i+1].r == 1)
- jebaj_pylek(i+1);
- if (i >= m && (i+1)%m != 0 && i+1 < m*n && w[i+1].r == 0)
- dzieci[t].PB(i+1);
- if (i >= m && w[i-m].r == 1)
- jebaj_pylek(i-m);
- if (i >= m && w[i-m].r == 0)
- dzieci[t].PB(i-m);
- if (i >= m && (i+1)%m != 0 && w[i-m+1].r == 1)
- jebaj_pylek(i-m+1);
- if (i >= m && (i+1)%m != 0 && w[i-m+1].r == 0)
- dzieci[t].PB(i-m+1);
- }
- void jebaj(int i)
- {
- if (pylek[i])
- return;
- jebaj_pylek(i);
- ++t;
- }
- queue<PII> q;
- int main()
- {
- init_ios();
- cin >> m >> n >> c;
- for (int i = 1; i <= c; ++i) {
- int x, y;
- char r;
- cin >> y >> x >> r;
- --x;
- --y;
- if (r == 'o')
- w[m*x+y].r = 1;
- else
- w[m*x+y].r = 2;
- }
- for (int i = 0; i < m*n; ++i) {
- if (w[i].r == 2)
- continue;
- if (w[i].r == 1) {
- jebaj(i);
- continue;
- }
- if (i+m < m*n)
- w[i].child.PB(i+m);
- if (i+m-1 < m*n && i%m != 0)
- w[i].child.PB(i+m-1);
- if (i >= m && i%m != 0)
- w[i].child.PB(i-1);
- if (i >= m && (i+1)%m != 0 && i+1 < m*n)
- w[i].child.PB(i+1);
- if (i >= m)
- w[i].child.PB(i-m);
- if (i >= m && (i+1)%m != 0)
- w[i].child.PB(i-m+1);
- }
- for (int i = 0; i < m; ++i) {
- if (w[i].r == 2)
- continue;
- if (w[i].r == 1) {
- if (wygrany_pyl[id_pyl[i]]) {
- cout<<"0\n";
- return 0;
- }
- for (int j = 0; j < dzieci[id_pyl[i]].size(); ++j) {
- if (vis[dzieci[id_pyl[i]][j]])
- continue;
- vis[dzieci[id_pyl[i]][j]] = true;
- q.push(MP(dzieci[id_pyl[i]][j], 1));
- }
- vis_pyl[id_pyl[i]] = vis[i] = true;
- }
- }
- for (int i = 0; i < m; ++i)
- if (w[i].r == 0 && !vis[i]) {
- vis[i] = true;
- q.push(MP(i, 1));
- }
- while (!q.empty()) {
- PII x = q.front();
- q.pop();
- if (x.ST >= n*m-m) {
- cout<<x.ND<<"\n";
- return 0;
- }
- for (int i = 0; i < w[x.ST].child.size(); ++i) {
- if (vis[w[x.ST].child[i]])
- continue;
- if (pylek[w[x.ST].child[i]]) {
- if (wygrany_pyl[id_pyl[w[x.ST].child[i]]]) {
- cout<<x.ND<<"\n";
- return 0;
- }
- if (vis_pyl[id_pyl[w[x.ST].child[i]]])
- continue;
- else {
- vis_pyl[id_pyl[w[x.ST].child[i]]] = true;
- for (int j = 0; j < dzieci[id_pyl[w[x.ST].child[i]]].size(); ++j) {
- if (vis[dzieci[id_pyl[w[x.ST].child[i]]][j]])
- continue;
- vis[dzieci[id_pyl[w[x.ST].child[i]]][j]] = true;
- q.push(MP(dzieci[id_pyl[w[x.ST].child[i]]][j], x.ND+1));
- }
- }
- }
- else {
- vis[w[x.ST].child[i]] = true;
- q.push(MP(w[x.ST].child[i], x.ND+1));
- }
- }
- }
- cout<<"-1\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement