#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;
}
Комментариев нет:
Отправить комментарий