// // main.cpp // oiw // // Created by Mikołaj Korulczyk on 15/12/2019. // Copyright © 2019 Mikołaj Korulczyk. All rights reserved. // #include <bits/stdc++.h> #include <map> #define x first #define y second using namespace std; int mvs[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; map<pair<int, int>, bool> field; map<pair<int, int>, bool> visited; int n, m, k; int r, c, z; int enemy; int X, Y; long long bfs() { queue<pair<int, int> > q1; queue<pair<int, int> > q2; q2.push(make_pair(0, 0)); int dst = 0; while(q2.size()) { swap(q1, q2); while(q1.size()) { pair<int, int> crds = q1.front(); q1.pop(); if(visited[make_pair(crds.x, crds.y)] || field[make_pair(crds.x, crds.y)]) { continue; } //cout << crds.x << " " << crds.y << endl; if(crds.x == n-1 && crds.y == m-1) { return dst; } visited[make_pair(crds.x, crds.y)] = true; for(int i = 0; i < 4; i++) { int local_x = crds.x+mvs[i][0]; int local_y = crds.y+mvs[i][1]; if(local_x >= 0 && local_x < n && local_y >= 0 && local_y < m && !visited[make_pair(local_x, local_y)]) { q2.push(make_pair(local_x, local_y)); //cout << "local " << local_x << " " << local_y << endl; } } //cout << "------" << endl; } dst++; } return 1e9; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> k; enemy = 0; while(k--) { cin >> r >> c >> z; X = (r^enemy)%n; Y = (c^enemy)%m; field[make_pair(X, Y)] = true; visited.clear(); //cout << visited.size() << endl; //cout << X << " " << Y << endl; if(bfs() != n+m-2) { cout << "TAK\n"; field[make_pair(X, Y)] = false; //cout << enemy << " " << z << endl; enemy ^= z; } else { cout << "NIE\n"; } } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | // // main.cpp // oiw // // Created by Mikołaj Korulczyk on 15/12/2019. // Copyright © 2019 Mikołaj Korulczyk. All rights reserved. // #include <bits/stdc++.h> #include <map> #define x first #define y second using namespace std; int mvs[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; map<pair<int, int>, bool> field; map<pair<int, int>, bool> visited; int n, m, k; int r, c, z; int enemy; int X, Y; long long bfs() { queue<pair<int, int> > q1; queue<pair<int, int> > q2; q2.push(make_pair(0, 0)); int dst = 0; while(q2.size()) { swap(q1, q2); while(q1.size()) { pair<int, int> crds = q1.front(); q1.pop(); if(visited[make_pair(crds.x, crds.y)] || field[make_pair(crds.x, crds.y)]) { continue; } //cout << crds.x << " " << crds.y << endl; if(crds.x == n-1 && crds.y == m-1) { return dst; } visited[make_pair(crds.x, crds.y)] = true; for(int i = 0; i < 4; i++) { int local_x = crds.x+mvs[i][0]; int local_y = crds.y+mvs[i][1]; if(local_x >= 0 && local_x < n && local_y >= 0 && local_y < m && !visited[make_pair(local_x, local_y)]) { q2.push(make_pair(local_x, local_y)); //cout << "local " << local_x << " " << local_y << endl; } } //cout << "------" << endl; } dst++; } return 1e9; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> k; enemy = 0; while(k--) { cin >> r >> c >> z; X = (r^enemy)%n; Y = (c^enemy)%m; field[make_pair(X, Y)] = true; visited.clear(); //cout << visited.size() << endl; //cout << X << " " << Y << endl; if(bfs() != n+m-2) { cout << "TAK\n"; field[make_pair(X, Y)] = false; //cout << enemy << " " << z << endl; enemy ^= z; } else { cout << "NIE\n"; } } return 0; } |