Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- //#include "graph.h"
- #include <unordered_set>
- enum class State { Not_Visited, In_Proccess, Finished };
- bool IsOk(const std::pair<int, int>& u, int N, int M) {
- if (u.first < 0 || u.first >= N || u.second < 0 || u.second >= M) {
- return false;
- }
- return true;
- }
- std::vector<std::pair<int, int>> GetAdjacentVertices(const std::pair<int, int>& u, int N, int M) {
- std::vector<std::pair<int, int>> adjVer;
- std::vector<int> delta_x = { 1, -1, 0 };
- std::vector<int> delta_y = { 1, -1, 0 };
- std::pair<int, int> v;
- for (auto dx : delta_x) {
- for (auto dy : delta_y) {
- if ((dx + dy) % 2 == 0) {
- continue;
- }
- v = std::make_pair(u.first + dx, u.second + dy);
- if (IsOk(v, N, M)) {
- adjVer.push_back(v);
- }
- }
- }
- return adjVer;
- }
- std::vector<std::vector<int>> FindPath(const std::vector<std::vector<int>>& matrix) {
- const int N = matrix.size();
- const int M = matrix[0].size();
- std::vector<std::vector<bool>> visited(N, std::vector<bool>(M, false));
- std::vector<std::vector<int>> length(N, std::vector<int>(M, -1));
- std::queue<std::pair<int, int>> order;
- std::pair<int, int> source;
- for (int i = 0; i < N; ++i) {
- for (int j = 0; j < M; ++j) {
- if (matrix[i][j] == 1) {
- source = std::make_pair(i, j);
- order.push(source);
- length[source.first][source.second] = 0;
- visited[source.first][source.second] = 1;
- }
- }
- }
- std::pair<int, int> u;
- while (!order.empty()) {
- u = order.front();
- order.pop();
- std::vector<std::pair<int, int>> adjVer = GetAdjacentVertices(u, N, M);
- for (auto iter = adjVer.begin(); iter != adjVer.end(); ++iter) {
- if (visited[iter->first][iter->second] == 0) {
- order.push(*iter);
- length[iter->first][iter->second] = length[u.first][u.second] + 1;
- visited[iter->first][iter->second] = 1;
- }
- }
- }
- return length;
- }
- int main() {
- int N, M;
- std::cin >> N >> M;
- std::vector<std::vector<int>> matrix(N, std::vector<int>(M, 0));
- for (size_t i = 0; i < N; ++i) {
- for (size_t j = 0; j < M; ++j) {
- std::cin >> matrix[i][j];
- }
- }
- std::vector<std::vector<int>> answer = FindPath(matrix);
- for (size_t i = 0; i < N; ++i) {
- for (size_t j = 0; j < M; ++j) {
- std::cout << answer[i][j] << ' ';
- }
- std::cout << '\n';
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement