#cpp #массивы #алгоритм #матрицы #олимпиада
Дан двухмерный массив целых чисел. Массив заполнен нулями и единицами. "Окружить" каждую единицу, заменив только 0 на порядковый номер единицы в массиве, считая от левого верхнего угла и далее по строкам. Пример входного потока:5 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 Пример выходного потока: 1 1 2 0 0 1 1 2 0 0 3 3 4 5 5 0 0 5 1 5 0 0 5 5 5 Привожу свою версию, но я явно что-то делаю не так, например, если единица стоит в конце строки, неверно считает. Или, если массив состоит из одной-двух строк или столбцов. Выводит порядковый номер даже когда единиц поблизости нет. Очень прошу помощи! #include#include using namespace std; int main() { int x,y,q=0; cin >> x >> y; int a[x][y]; for (int i=0;i > a[i][j]; } } for (int i=0;i 3) lim1=3; else lim1=x; if (y>3) lim2=3; else lim2=y; for (int m=0;m Ответы
Ответ 1
Как-то так, если я правильно понял условие. #include#include using namespace std; int main() { int x, y, q = 0; cin >> x >> y; vector > m(x, vector (y, 0)); for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { cin >> m[i][j]; } } for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { if (m[i][j] == 1) { q++; // обход подматрицы 3x3, центр которой 1 for (int a = i - 1; a <= i + 1; a++) { for (int b = j - 1; b <= j + 1; b++) { // проверка границ и что элемент можно изменить if (a >= 0 && a < x && b >= 0 && b < y && m[a][b] == 0) { m[a][b] = q; } } } } } } for (auto& v : m) { for (auto& i : v) { cout << i << ' '; } cout << '\n'; } } Ответ 2
#includeint main() { int x = 5; int y = 5; int matrix[x][y] = { {1, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 1, 0}, {0, 0, 0, 0, 0} }; for (int i = 0; i < x; ++i) { for (int j = 0; j < y; ++j) { std::cout << matrix[i][j] << " "; } std::cout << std::endl; } std::cout << std::endl; int count = 0; int points[8][2] = { {-1, 1}, { 0, 1}, { 1, 1}, { 1, 0}, { 1, -1}, { 0, -1}, {-1, -1}, {-1, 0}}; for (int i = 0; i < x; ++i) { for (int j = 0; j < y; ++j) { if (matrix[i][j] == 1) { ++count; for (auto point : points) { int xi = i + point[0]; int yj = j + point[1]; if (xi < 0 || xi >= x) { continue; } if (yj < 0 || yj >= y) { continue; } if (matrix[xi][yj] == 0) { matrix[xi][yj] = count; } } } } } for (int i = 0; i < x; ++i) { for (int j = 0; j < y; ++j) { std::cout << matrix[i][j] << " "; } std::cout << std::endl; } return 0; }
Комментариев нет:
Отправить комментарий