Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define F first
- #define S second
- #define pii pair<int, int>
- pair<int, int> s, d;
- int n, m, b;
- vector<pair<int, int>> moves = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}, {0, 1}, {0, -1}, {-1, 0}, {1, 0}};
- vector<vector<bool>> vis(101, vector<bool>(101, false));
- map<pair<int, int>, pair<int, int>> par;
- vector<vector<char>> v(101, vector<char>(101, '.'));
- bool isValid(pii x)
- {
- return (0 <= x.F && x.F < n) && (0 <= x.S && x.S < m);
- }
- bool bfs()
- {
- sort(moves.begin(), moves.end());
- vis[s.F][s.S] = 1;
- queue<pair<int, int>> q;
- q.push(s);
- while (!q.empty())
- {
- pii node = q.front();
- for (auto i : moves)
- {
- pii nei;
- nei.F = node.F + i.F;
- nei.S = node.S + i.S;
- if (isValid(nei))
- {
- if (!vis[nei.F][nei.S])
- {
- if (nei.F == d.F && nei.S == d.S)
- {
- // found
- par[nei] = node;
- vector<pii> path;
- path.push_back(d);
- pii start = d;
- while (start != s)
- {
- start = par[start];
- path.push_back(start);
- }
- // path.push_back(start);
- cout << path.size() - 1 << endl;
- reverse(path.begin(), path.end());
- for (int i = 0; i < path.size() - 1; i++)
- {
- cout << path[i].F << ',' << path[i].S << " -> ";
- }
- cout << d.F << ',' << d.S << endl;
- return true;
- }
- if (v[nei.F][nei.S] != 'x')
- {
- par[nei] = node;
- vis[nei.F][nei.S] = 1;
- q.push(nei);
- }
- }
- }
- }
- q.pop();
- }
- // cout << -1 << endl;
- return false;
- }
- void clear(int n, int m)
- {
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- vis[i][j] = false;
- }
- }
- par.clear();
- }
- void solve()
- {
- cin >> n >> m >> b;
- // pair<int, int> source, dest;
- cin >> s.first >> s.second;
- cin >> d.first >> d.second;
- // cout << s.F << ' ' << s.S << endl;
- // cout << d.F << ' ' << d.S << endl;
- for (int i = 0; i < b; i++)
- {
- int x, y;
- cin >> x >> y;
- v[x][y] = 'x';
- }
- if (s.F == d.F && s.S == d.S)
- {
- cout << 0 << endl;
- cout << s.F << ' ' << s.S << endl;
- return;
- }
- if (bfs())
- ;
- else
- cout << -1 << endl;
- clear(n, m);
- }
- int main()
- {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- freopen("error.txt", "w", stderr);
- /* Enter your code here. Read input from STDIN. Print output to STDOUT */
- int t;
- cin >> t;
- int x = 1;
- while (t--)
- {
- // cout << "tc : " << x++ << endl;
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment