Как присвоить диагоналям на которых лежит выбранный пользователем элемент любое значение?
#include <cmath>
#include <stdio.h>
#include <iostream>
#include <iomanip>
using namespace std;
void print_array(int** array, int N, int M)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cout << setw(5) << right << array[i][j];
}
cout << endl;
}
}
int main()
{
const int N = 5, M = 5;
int** array;
array = new int* [N];
for (int i = 0; i < N; i++)
{
array[i] = new int[M];
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
array[i][j] = 1;
}
}
cout << "Before" << endl;
int x = 0, y = 0;
while (cin >> x >> y)
{
print_array(array, N, M);//Вывод матрицы ДО изменений
//Операции изменений над матрицей
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
array[i][y] = 0;
array[x][j] = 0;
}
}
cout << "After" << endl; //Вывод матрицы после изменений
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cout << setw(5) << right << array[i][j];
}
cout << endl;
}
cout << endl;
system("pause");
}
for (int i = 0; i < N; i++)
{
delete[] array[i];
}
delete[] array;
}
Ответы (1 шт):
Автор решения: V-Mor
→ Ссылка
Данный код имеет необходимый функционал взамен того, что был изначально.
#include <cmath>
#include <stdio.h>
#include <iostream>
#include <iomanip>
using namespace std;
void print_array(int** array, int N, int M)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cout << setw(5) << right << array[i][j];
}
cout << endl;
}
}
int main()
{
const int N = 5, M = 5;
int** array;
array = new int*[N];
for (int i = 0; i < N; i++)
{
array[i] = new int[M];
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
array[i][j] = 1;
}
}
cout << "Before" << endl;
int x = 0, y = 0;
while (cin >> x >> y)
{
print_array(array, N, M);//Вывод матрицы ДО изменений
//Операции изменений над матрицей
/*for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
array[i][y] = 0;
array[x][j] = 0;
}
}*/
//////////////////////////////////////////////////////////////////
// Здесь начинается добавленный код
//////////////////////////////////////////////////////////////////
// Рисуем "луч" вправо вниз
for (int i = x, j = y; (i < N) && (j < M); i++, j++)
{
array[i][j] = 0;
}
// Рисуем "луч" влево вниз
for (int i = x, j = y; (i < N) && (j >= 0); i++, j--)
{
array[i][j] = 0;
}
// Рисуем "луч" влево вверх
for (int i = x, j = y; (i >= 0) && (j >= 0); i--, j--)
{
array[i][j] = 0;
}
// Рисуем "луч" вправо вверх
for (int i = x, j = y; (i >= 0) && (j < M); i--, j++)
{
array[i][j] = 0;
}
//////////////////////////////////////////////////////////////////
// Здесь заканчивается добавленный код
//////////////////////////////////////////////////////////////////
cout << "After" << endl; //Вывод матрицы после изменений
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cout << setw(5) << right << array[i][j];
}
cout << endl;
}
cout << endl;
system("pause");
}
for (int i = 0; i < N; i++)
{
delete[] array[i];
}
delete[] array;
}
Решение "в лоб" и использует 4 цикла для отрисовки каждого из "лучей креста". Возможно, найдутся более элегантные варианты, но этот тоже рабочий и имеет место быть.
Алгоритм простой, но вкратце поясню: чтобы нарисовать один "луч", нужно на каждой итерации цикла сразу увеличивать оба счётчика, чтобы "двигаться по диагонали". Для этого в теле for проинициализированы, проверяются и изменяются сразу i и j. Когда один из счётчиков доходит до границ матрицы, прорисовка очередного "луча" заканчивается.