Задача о поворачивании колец из чисел - C (СИ)
Формулировка задачи:
Поверните четыре кольца так, что бы суммы каждой четверки чисел, которые расположены вдоль одного радиуса, были одинаковыми. Чему они равны?
Народ хэлпуйте!
Решение задачи: «Задача о поворачивании колец из чисел»
textual
Листинг программы
#include <iostream>
#include <vector>
#include <conio.h>
#include <locale>
using namespace std;
const int Rows = 4;
const int colums = 12;
int arr[Rows][colums] = {
{ 3, 9, 6, 4, 3, 7, 5, 2, 4, 8, 3, 6 },
{ 8, 4, 7, 5, 8, 2, 9, 5, 5, 8, 4, 6 },
{ 6, 5, 8, 1, 6, 6, 7, 1, 3, 7, 1, 9 },
{ 9, 2, 4, 6, 8, 4, 3, 8, 5, 2, 3, 7 }
};
void lshift(int *beg, int n)
{
int temp = *beg;
++beg;
--n;
while (n--)
{
*(beg - 1) = *beg;
++beg;
}
*(beg - 1) = temp;
}
int sum(int *beg, int n, int m)
{
int s = 0;
for (int i = 0; i < n; i++, beg += m)
{
s += *beg;
}
return s;
}
void printArr()
{
for (int i = 0; i < Rows; i++)
{
for (int j = 0; j < colums; j++)
{
cout << arr[i][j] << ' ';
}
cout << endl;
}
}
int gen(int i)
{
int s = sum(&arr[0][0], Rows, colums);
if (i >= Rows) return 0;
for (int j = 1; j < colums; j++)
{
if (s != sum(&arr[0][j], Rows, colums))
{
s = 0;
break;
}
}
if (s != 0)
{
return s;
}
for (int j = 0; j < colums; j++)
{
lshift(arr[i], colums);
s = gen(i + 1);
if(s != 0) return s;
}
return 0;
}
int main()
{
setlocale(LC_ALL, "ukr");
int i ,j;
cout <<"Несортирований массив\n";
for (int i = 0; i < Rows; i++)
{
for (int j = 0; j < colums; j++)
{
cout <<arr[i][j]<< ' ';
}
cout << endl;
}
cout <<"\n";
cout <<"Сортированный массив\n";
int s = gen(0);
printArr();
cout << "\nСумма каждой четвёрки елементов = "<< s;
getch();
}
Объяснение кода листинга программы
Код решает задачу сортировки массива поворотом колец. Список действий:
- Включаем необходимые заголовочные файлы:
iostream- для работы с потоками ввода/выводаvector- для работы с векторамиconio.h- для работы с функциейgetch(), которая используется для приостановки выполнения программы до нажатия клавишиlocale- для установки локали (языка) вывода
- Определяем константы:
Rows- количество строк (колец) в массивеcolums- количество столбцов в массиве
- Инициализируем массив:
- Создаём одномерный массив
arrразмеромRowsнаcolums - Инициализируем его значениями, представленными в виде списка
- Создаём одномерный массив
- Находим сумму элементов массива:
- Функция
sumпринимает указатель на первый элемент массива, размер массива и номер элемента, с которого начинается суммирование - Суммируем все элементы массива, начиная с указанного
- Функция
- Проверяем на четность/нечетность суммы элементов:
- Функция
genрекурсивно вызывает себя для каждого кольца в массиве - Проверяет, является ли сумма элементов четной или нечетной
- Если сумма нечетная, то рекурсивно вызывается функция
genдля следующего кольца - Если сумма четная, то рекурсивно вызывается функция
genдля следующего кольца - Если сумма равна нулю, то текущее кольцо считается отсортированным
- Функция
- Выводим массив на экран:
- Функция
printArrвыводит значения массива на экран
- Функция
- Выводим отсортированный массив:
- После вызова функции
gen(0), массив будет отсортирован по возрастанию - Вызываем функцию
printArrдля вывода отсортированного массива
- После вызова функции
- Выводим сумму каждой четверки элементов:
- В функции
mainвычисляем сумму каждой четверки элементов и выводим её на экран
- В функции
- Останавливаем выполнение программы:
- Используем функцию
getch()для приостановки выполнения программы до нажатия клавиши
- Используем функцию