Помогите пожалуйста с кодом (C++)
Дана действительная квадратная матрица размера n. Расположить элементы матрицы следующим образом:
#include <stdlib.h>
#include <locale.h>
#include <iostream>
#include <conio.h>
int Input(int **mt, int i, int j, int n);
void Ouput(int **mt, int i, int j, int n);
int main()
{
setlocale(LC_ALL, "Russian");
int i, j, n;
int **mt;
int tmp;
mt = (int**)malloc(3 * sizeof(int*));
if (!mt) return 0;
for (i = 0; i < 3; ++i)
*(mt + i) = (int*)malloc(3 * sizeof(int));
if (!*(mt + i)) return 0;
do
{
printf("Введите размеры матрицы = ");
scanf_s("%d", &n);
} while (n <= 0);
//Вводим элементы
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
printf("nВведите элементы [%d][%d] = ", i + 1, j + 1);
scanf_s("%d", *(mt + i) + j);
}
//Выводим получившееся
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%3d ", mt[j]);
}
printf("n");
}
system("pause");
return 0;
}
Это ввод и вывод матрицы, как заставить её стать змейкой??????
На первом круге каждый участок имеет длину n - 1, на каждом следующем круге становится короче на 2.
Ниже я заполнил половину таблицы :)
Код:
int s; // первое число в заполняемой строке или столбце
for (i = 0; i < n; ++i)
memset(*(mt + i), 0, n * sizeof(int)); // когда змейкой будет заполнена вся таблица, обнуление станет ненужным
// змейка движется вправо
s = 1;
for (i = 0; i < n/2; ++i)
{
for (j = i; j < n - 1 - i; ++j)
mt[i][j] = s + j - i;
s += (n - 1 - 2 * i) * 4; // увеличиваем на длину i-го круга
}
// змейка движется вниз
s = n;
for (j = 0; j < n/2; ++j)
{
for (i = j; i < n - 1 - j; ++i)
mt[i][n - 1 - j] = s + i - j;
s += (n - 1 - 2 * j) * 4 - 2;
}
// центральная клетка при нечётном n
if (n % 2 != 0)
mt[n/2][n/2] = n * n;
for (i = 0; i < n; ++i)
memset(*(mt + i), 0, n * sizeof(int)); // когда змейкой будет заполнена вся таблица, обнуление станет ненужным
// змейка движется вправо
s = 1;
for (i = 0; i < n/2; ++i)
{
for (j = i; j < n - 1 - i; ++j)
mt[i][j] = s + j - i;
s += (n - 1 - 2 * i) * 4; // увеличиваем на длину i-го круга
}
// змейка движется вниз
s = n;
for (j = 0; j < n/2; ++j)
{
for (i = j; i < n - 1 - j; ++i)
mt[i][n - 1 - j] = s + i - j;
s += (n - 1 - 2 * j) * 4 - 2;
}
// центральная клетка при нечётном n
if (n % 2 != 0)
mt[n/2][n/2] = n * n;
Цитата: Roleri
Разбейте путь змейки на участки, где она движется вправо, вниз, влево и вверх, и немного посчитайте.
На первом круге каждый участок имеет длину n - 1, на каждом следующем круге становится короче на 2.
Ниже я заполнил половину таблицы :)
На первом круге каждый участок имеет длину n - 1, на каждом следующем круге становится короче на 2.
Ниже я заполнил половину таблицы :)
Код:
int s; // первое число в заполняемой строке или столбце
for (i = 0; i < n; ++i)
memset(*(mt + i), 0, n * sizeof(int)); // когда змейкой будет заполнена вся таблица, обнуление станет ненужным
// змейка движется вправо
s = 1;
for (i = 0; i < n/2; ++i)
{
for (j = i; j < n - 1 - i; ++j)
mt[i][j] = s + j - i;
s += (n - 1 - 2 * i) * 4; // увеличиваем на длину i-го круга
}
// змейка движется вниз
s = n;
for (j = 0; j < n/2; ++j)
{
for (i = j; i < n - 1 - j; ++i)
mt[i][n - 1 - j] = s + i - j;
s += (n - 1 - 2 * j) * 4 - 2;
}
// центральная клетка при нечётном n
if (n % 2 != 0)
mt[n/2][n/2] = n * n;
for (i = 0; i < n; ++i)
memset(*(mt + i), 0, n * sizeof(int)); // когда змейкой будет заполнена вся таблица, обнуление станет ненужным
// змейка движется вправо
s = 1;
for (i = 0; i < n/2; ++i)
{
for (j = i; j < n - 1 - i; ++j)
mt[i][j] = s + j - i;
s += (n - 1 - 2 * i) * 4; // увеличиваем на длину i-го круга
}
// змейка движется вниз
s = n;
for (j = 0; j < n/2; ++j)
{
for (i = j; i < n - 1 - j; ++i)
mt[i][n - 1 - j] = s + i - j;
s += (n - 1 - 2 * j) * 4 - 2;
}
// центральная клетка при нечётном n
if (n % 2 != 0)
mt[n/2][n/2] = n * n;
Спасиб)
Не забывайте о free();