Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

Как окружить единицы их порядковыми номерами в матрице?

#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;i3) 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



#include int 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; }

Комментариев нет:

Отправить комментарий