Как присвоить диагоналям на которых лежит выбранный пользователем элемент любое значение?

#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. Когда один из счётчиков доходит до границ матрицы, прорисовка очередного "луча" заканчивается.

→ Ссылка