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

126
01 августа 2019, 16:30

Дан двухмерный массив целых чисел. Массив заполнен нулями и единицами. "Окружить" каждую единицу, заменив только 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 <iostream>
#include <cmath>
using namespace std;
int main()
{
  int x,y,q=0;
  cin >> x >> y;
  int a[x][y];
  for (int i=0;i<x;i++)
  {
    for (int j=0;j<y;j++)
    {
      cin >> a[i][j];
    }
  }
  for (int i=0;i<x;i++)
  {
    for (int j=0;j<y;j++)
    {
      if (a[i][j]==1)
      {
        q++;
        int lim1=3,lim2=3;
        if (x>3) lim1=3; else lim1=x;
        if (y>3) lim2=3; else lim2=y;
        for (int m=0;m<lim1;m++)
        {
          for (int n=0;n<lim2;n++)
          {
            int t,u;
            u=abs(i-1+m);
            t=abs(j-1+n);
            if (a[u][t]==0) a[u][t]=q;
          }
        }
        a[i][j]=1;
      }
    }
  }
  for (int i=0;i<x;i++)
  {
    for (int j=0;j<y;j++)
    {
      cout << a[i][j] << " ";
    }
    cout << endl;
  }
  return 0;
}

Задача, которая предшествовала этой в каталоге задач: Дан двухмерный массив целых чисел. Массив заполнен нулями и единицами. "Окружить" каждую единицу двойками, заменив только 0 на 2 (моё решение, все тесты пройдены: cpp.sh/5aeb6).

Answer 1

Как-то так, если я правильно понял условие.

#include <iostream>
#include <vector>
using namespace std;
int main() {
    int x, y, q = 0;
    cin >> x >> y;
    vector<vector<int>> m(x, vector<int>(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';
    }
}
Answer 2
#include <iostream>

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;
}

READ ALSO
Как записать русские буквы в массив?

Как записать русские буквы в массив?

char arr[] = {'а', 'б', 'в', 'г'} когда я пишу такой массив выдаёт ошибку "ошибка: excess elements in char array initializer" что нужно сделать что бы исправить? Я писал не консольное...

109
строка из собственной программы [закрыт]

строка из собственной программы [закрыт]

Пытаюсь получать строку из maincpp

123
Избавиться от QSignalMapper

Избавиться от QSignalMapper

Мне нужно что бы несколько объектов вызывали один слот, и можно было понять, какой объект вызвал слотВ данном примере я попробовал использовать...

120