/*
Ох блять я этот код весь день писал, задание пиздец ебаное оказалось
Я его написал, но оно выглядит давольно нелепо и я уверен его можно хоть чутка оптимизировать
Дохуя вопросов по самому заданию появилось ты их спросишь у учитиля
Ты мне пиздец как торчишь за него
*/
/*
!!!!!!!!!!!!!
Короче я убрал переменные xyz из глобальных
И передаю их в функцию solution
В solution я ловлю аргумент по ссылку это вот этот символ &
Чесн я хуй знает правильно ли это или нет
Но пока по другому я не понял как делать
Т.к. x y у нас меняются и мне нужно делать аргумент по ссылке
Можно еще указатель исп. могу исправить если он выебываться начнет
Как мне кажется тут сейчас все норм в функции main у нас обьявление переменных
А в solution мы выполняем действия
И я до сих пор не понял что такое процедура и какая разница между функцией
*/
#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>
#include <iomanip>
#include <math.h>
/*
тут библиотеки подключаем
*/
using namespace std; //чтобы каждый раз std:: не вызывать
#define n = 7
int solution(int &x, int &y, int sq[][n]) //так тут функция прохождения по квадрату пока сюда не смотри мы еще сюда вернемся
{
/*
нам нужно проверить выходит ли x и y из размера массива, если уходит в плюс значит мы переходим на противоположенную строку(столбец) которая равна 0 (начальная строка)
*/
if (x > 6)
x = 0;
if (y > 6)
y = 0;
/*
тут тоже самое только если выходим из массива с миннусом и идем в ласт строку(столбец)
*/
if (x < 0)
x = 6;
if (y < 0)
y = 6;
/*
Вот мы перешли на новую строку(столбец), и даже если не перешли, нам нужно проверить, а не заполнена ли эта клетка
Изначально у нас все заполнено нулями, т.е. 0 это пустота
Вот и проверяем а равна ли нулю наша клетка
*/
if (sq[x][y] != 0)
{
/*
Если все таки не ровна нулю, то по условию мы должны вернуться назад
Для этого мы исп. две строки после коментария
*/
x++;
y++;
/*
Не забываем проверить а не выходим ли мы из массива
Проверяем мы только x потому что выйти дальше чем на 1 число нам не страшно, т.к. дальше будет вызвана рекурсия(об этом чуть позже)
По y проверять не нужно дальше чем на 1 число выйти не реально
*/
if (x > 6)
x = 0;
/*
Проверили не выходим ли и прибовляем (двигаемся вниз) так написанно в задание
*/
x++;
/*
Вызываем саму себя, это назыввается рекурсия
Лучше пойди почитай про рекурсию без нее тут вообще никак
*/
solution(x,y,sq);
}
}
int main() //главная функция тут все начинается
{
int x = 0; //нужна для перемещения по квадрату уже не глобально
int y = 3; //тоже что и сверху но тут мы середину строки выбираем тут она равна 3, 3 потому что надо плюсовать 1
int z = 1; //для заполнения нужно 1-2-3-4 и т.д.
int max = pow(n,2); //мы проходим по квадрату 7x7 раз
int sq[n][n]; // Создаем квадрат типа int размером 7x7 двумерным массивом
/*
Я решил сделать так, заполнить массив нулями и потому его заполнять нужными нам числами
Ниже цикл по заполненюю массива нулями и сразу же вывод
*/
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
sq[i][j] = 0;
cout << setw(4)<< sq[i][j];
}
cout << "\n"; //для красоты
}
cout << "\n"; //для красоты
while (max > 0) // здесь нам и пригодилась max проходим мы по этому циклу 49 раз
{
solution(x, y, sq); //сразу же мы вызываем функцию magic и передаем в нее массив sq, переходи на 23 строку
sq[x][y] = z;
z++; //увеличиваем на 1
x--; //двигаемся по стандарту вниз
y--; //двигаемся по стандарту влево
max--; //минусуем наш счетчик цикла
}
/*
Ниже простой вызов нашего магического квадрата
*/
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << setw(4)<< sq[i][j];
}
cout << "\n";
}
}
/*
Весь код написан только под квадрат 7 на 7
Его изи переделать на любой размер, но это только если попросят
Запиши все что тебе говорит учитель
Так же можно ебануть проверку магический ли это квадрат
*/