Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2017, 21:16   #1
Rezcik
 
Регистрация: 30.01.2017
Сообщений: 5
По умолчанию [C++] Заполнение квадратной матрицы по схеме, указанной на приложенном рисунке

Дано натуральное N (1<=N<=10). Заполнить матрицу размера NxN целыми числами 0, 1, 2, 3, …,N^2-1
в соответствии со схемой.
Изображения
Тип файла: png wq.png (2.9 Кб, 173 просмотров)
Rezcik вне форума Ответить с цитированием
Старый 26.04.2017, 21:23   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Тут не решатель задач.

Покажите свои наработки, конкретные вопросы и т.п.

Или в раздел Фриланс если вы не хотите ничего делать, а ищете кого-то, кто выполнит ваши задачи за вознаграждение.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 04.06.2017, 21:19   #3
Rezcik
 
Регистрация: 30.01.2017
Сообщений: 5
По умолчанию

Вот набросок, помогите пожалуйста
Код:
#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
 
//Выделение памяти под матрицу n*n
void CreateMatrix(int **& a, int n)
{
    a = new int *[n];
    for (int i = 0;i < n;i++)
        a[i] = new int[n];
    return;
}
 
//Вывод на консоль матрицу a
void PrintMatrix(int ** a, int n)
{
    for (int i = 0;i < n;i++)
    {
        for (int j = 0;j < n;j++)
            cout << setw(6) << a[i][j];
        cout << endl;
    }
    return;
}
 
//Вычисление координат <i,j> элемента k в матрице n*n 
void coordinates(int k, int n, int &i, int &j)
{
    j = (n * n - k - 1) / n;
    i = k % n;
}
 
//Заполнение матрицы  a размера n*n числами 0,1,2,..,n*n-1 
void FillMatrix(int**&a, int n)
{
    for (int k = 0; k < n * n; k++)
    {
        
        int i, j, s;
        coordinates(k, n, i, j);
        a[i][j] = k;
        
            for (s = 0;s <= n-1;s++)
            {
                // Верхний треугольник 
                if (s % 2 == 0)
                    for (int i = s;i >= 0;i--)
                        a[i][s - i] = k++;
                else
                    for (int i = 0; i <= s;i++)
                        a[i][s - i] = k++;
            }
            // Нижний треугольник 
            for (s = n;s <= 2 * n - 2;s++)
            {
                if (s % 2 == 0)
                    for (int i = n - 1;i >= s - n + 1;i--)
                        a[i][s - i] = k++;
                else
 
                    for (int i = s - n + 1;i <= n - 1;i++)
                        a[i][s - i] = k++;
            }
        }
    }
 
void main()
{
    int n;
    const int nmax = 10;
    do {
        cout << "Enter a matrix size:" << endl;
        cin >> n;
    } while ((n < 1) || (n > nmax));
 
    int** a;
    CreateMatrix(a, n);
    FillMatrix(a, n);
    cout << "Sorted matrix:" << endl;
    PrintMatrix(a, n);
    system("pause");
    return;
}
Rezcik вне форума Ответить с цитированием
Старый 05.06.2017, 01:04   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Я вроде забацал (половину):

1.png


ну а нижняя половина - по аналогии: конструкция таже, только начальные значения, где-то меняется плюс на минус (или наоборот), пределы для циклов... будет другим.
Попробуй понять как формируется верхняя половина - прям "выпиши себе на листочек значения всех переменных, и проследи как они меняются на каждом шаге алгоритма"...
Попробуй понять, где в коде заложены переходы по горизонтали и вертикале матрицы, а где переходы "косые" осуществляется; и разберись, какие шаблоны повторяются в верхней части, а какие в нижней...
Будет у тебя, прежде чем сделаешь, много ошибок - это нормально - у меня раз 10-ть аварийно завершалась программа (пока не сделал верхний треугольник)...

И если ты будешь работать над задачей, прилагать усилия к решению проблемы, то, в конечном варианте, у тебя всё получиться.

Последний раз редактировалось ura_111; 05.06.2017 в 02:15.
ura_111 вне форума Ответить с цитированием
Старый 05.06.2017, 03:07   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j)
        a[i][j] = (n * n + n - j * j - j) / 2 + (i > j) * (n * (j + j % 2) - j - 2) + (1 - 2 * (i <= j)) * (1 + j * ((j + n * (i <= j)) % 2) + i * (1 - 2 * ((j + n * (i <= j)) % 2)));
Надоело упрощать формулу
Но такое решение, скорее, для развлечения.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 05.06.2017 в 03:20.
BDA вне форума Ответить с цитированием
Старый 05.06.2017, 08:50   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Хз, я в лоб решал с дополнительными переменными. Вроде даже работает:

Код:
	int N = 5;
	int matrix[5][5];
	bool DownMovement = true;
	int k = 0;
	int j = 0;

	for (int i = N - 1; i >= 0; i--) {

		while ((j <= i) && (j >= 0)){

			matrix[j][i] = k;
			k++;
			if (DownMovement) {
				j++;
			}
			else {
				j--;
			}
		}


		DownMovement = !DownMovement;
		if (DownMovement) {
			j = 0;
		}
		else{
			j = i - 1;
		}

	}

	DownMovement = true;
	j = 1;

	for (int i = 0; i < N; i++) {

		while ((j > i) && (j < N)){

			matrix[j][i] = k;
			k++;
			if (DownMovement) {
				j++;
			}
			else {
				j--;
			}

		}

		DownMovement = !DownMovement;

		if (DownMovement) {
			j = i + 2;
		}
		else{
			j = N - 1;
		}

	}
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 05.06.2017, 23:20   #7
Rezcik
 
Регистрация: 30.01.2017
Сообщений: 5
По умолчанию

Спасибо большое за помощь!!!
Rezcik вне форума Ответить с цитированием
Старый 06.06.2017, 05:51   #8
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Надоело упрощать формулу
Поделитесь ходом мысли. Что, куда и как что такая формула?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 08.06.2017, 01:14   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Поделитесь ходом мысли. Что, куда и как что такая формула?
До сокращения:
Код:
if (i <= j) {
    //верхний
    a[i][j] =
    (j + 1 + n) * (n - j) / 2 -       // 1
    ((j + n + 1) % 2) * (i + 1) -     // 2
    ((j + n) % 2) * (j - i + 1);      // 3
} else {
    //нижний
    a[i][j] =
    ((n + 1) * n / 2 - 1) +
    (2 * n - 2 - j) * (j + 1) / 2 -   // 1
    ((j + 1) % 2) * (n - i - 1)  -    // 2
    (j % 2) * (- j + i - 1);          // 3
}
Сначала рассматривались верхний и нижний треугольники отдельно. Затем в каждом в треугольнике рассматривались столбцы, то есть задавалась такая формула, которая в столбец пишет число, равное количеству элементов в этом и предыдущих столбцах (1я). Затем подбирались такие вычитаемые элементы (2й и 3й), чтобы в каждой клетке оказалось нужное число.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal Матрицы - элемент bij которой равен сумме элементов данной матрицы расположенных в области, определяемой индексами i,j так, как показано на рисунке users1 Помощь студентам 0 12.01.2017 06:04
Создать таблицу и закрасить её ячейки так, как это показано на приложенном рисунке Chips186 JavaScript, Ajax 4 20.12.2016 00:09
ЗАПОЛНЕНИЕ МАССИВА ПО УКАЗАННОЙ ТРАЕКТОРИИ _-DAFNA-_ Помощь студентам 0 14.02.2012 23:05
Заполнение Квадратной Матрицы Konrak Помощь студентам 3 16.05.2011 19:03
Заполнение квадратной матрицы по спирали [Delphi] willams Помощь студентам 2 13.12.2010 09:05