Skip to content

Instantly share code, notes, and snippets.

@safoyeth
Last active April 26, 2017 04:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save safoyeth/ac7f2c66791f6ac9ee5d9c34fba00e57 to your computer and use it in GitHub Desktop.
Save safoyeth/ac7f2c66791f6ac9ee5d9c34fba00e57 to your computer and use it in GitHub Desktop.
Simple circle system algorythm
// CircleSystem.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <vector>
#include <string>
using namespace std;
void circle(vector<string> players)
{
// Если игроков нечётное количество, то добавляем ещё одного. Обзываем его "Отдыхает" или как хотим.
if (players.size() % 2 != 0) players.push_back("Отдыхает");
// Просто распечатываем нормализованный список игроков. Удали/закомментируй, если не нужно.
for each (string player in players)
{
cout << player << endl;
}
// Создаём список списков списков.
vector<vector<vector<string>>> data;
// Количество пар в туре.
int pairs = players.size() / 2;
// Количество туров
int tours = players.size() - 1;
// Дальше всё делаем в цикле по каждому туру
for (int i = 0; i < tours; i++)
{
// Создаём список списков для туров, в нём будут списки пар участников
vector<vector<string>> tour;
// Для каждого тура
for (int j = 0; j < pairs; j++)
{
// Создаём список пар
vector<string> pair;
pair.push_back("white"); // заполняем их какими-либо значениями, главное, чтобы разными для белых и чёрных
pair.push_back("black"); // ну или для домашних/выездных, если речь идёт о командах
tour.push_back(pair); // добавляем каждую пару в список тура
}
if (i % 2 == 0)
{
tour[0][1] = players[tours]; // для каждого "чётного" тура (на самом деле для НЕчётного, так как счёт же с нуля в .cpp)
// последний игрок в списке играет в первой паре всегда чёрными (второй в паре)
}
else
{
tour[0][0] = players[tours]; // для каждого "нечётного" тура (опять же для чётного для обычных людей)
// последний игрок в списке играет в первой паре всегда белыми (первый в паре)
}
data.push_back(tour); //добавляем тур в общий список
}
// можно дальше всё закомментить и посмотреть на то, что получилось (картинка №3)
int iterator = 0; // задаём итератор — начало списка
for (int tour = 0; tour < tours; ++tour) // для каждого тура
{
for (int pair = 0; pair < pairs; ++pair) // в каждой паре
{
if (data[tour][pair][0] == "white") // находим первого участника в паре и если он не занят (white - это условно пустое значение)
{
data[tour][pair][0] = players[iterator]; // вставляем текущего игрока
if (iterator < players.size() - 2) // если итератор не дошёл до предпоследнего игрока
{
iterator++; //увеличиваем на единицу
}
else
{
iterator = 0; // говорим взять первого участника из списка
}
}
else // если первый участник в паре уже определён (не white)
{
data[tour][pair][1] = players[iterator]; // ставим текущего участника вторым в пару — чёрными (или гостем для футбола какого-нибудь)
if (iterator < players.size() - 2) // снова проверяем, нужно ли продолжать проход по циклу
{
iterator++; // нужно
}
else
{
iterator = 0; // не нужно
}
}
}
}
// снова можно закомментить и посмотреть, что получилось (картинка №4)
players.pop_back(); // удаляем последнего игрока (так как мы его уже поставили во все туры — мы с него начинали)
iterator = players.size() - 1; // устанавливаем итератор в КОНЕЦ списка
for (int tour = 0; tour < tours; ++tour) // снова для каждого тура
{
for (int pair = 0; pair < pairs; ++pair) // снова для каждой пары
{
if (data[tour][pair][0] == "white") // выбираем белый цвет
{
if (data[tour][pair][1] != players[iterator]) // если игрока (команды) в нашем списке НЕТ в этой паре (то есть мы НЕ включили его в предыдущую итерацию)
{
data[tour][pair][0] = players[iterator]; // ставим его первым в пару
if (iterator >= 1) // если итератор больше 1
{
iterator--; //уменьшаем итератор (мы проходим как-бы назад по списку)
}
else
{
iterator = players.size() - 1; // иначе выставляем итератор в исходную позицию (в конец списка)
}
}
}
if (data[tour][pair][1] == "black") //выбираем чёрный цвет (или гостей, пофиг)
{
if (data[tour][pair][0] != players[iterator]) // снова проверяем, нет ли этого игрока УЖЕ в ЭТОЙ паре. Если нет, то
{
data[tour][pair][1] = players[iterator]; // ставим его вторым в паре
if (iterator >= 1) //опять проверяем итератор
{
iterator--;
}
else
{
iterator = players.size() - 1;
}
}
}
}
}
/* А это просто вывод на печать и ничего больше. Тут можно написать что-то своё.
Если нужно выводить номера туров, то вместо for each нужно использовать цикл for
такой же, как я использовал выше
*/
string output = "";
for each (vector<vector<string>> tour in data)
{
for each(vector<string> pair in tour)
{
output += (pair[0] + " - " + pair[1] + "; ");
}
output += "\n";
}
cout << output;
}
int main()
{
SetConsoleCP(1251); // это чтобы винда нормально работала с кириллицей
SetConsoleOutputCP(1251); // и это тоже. для линуксов танцевать с бубном вроде не надо
//vector<string> players{ "Иванов", "Петров", "Сидоров" }; // создание списка участников
//circle(players); // вызов метода
/*
Если вдруг препод захочет вводить из консоли произвольное количество участников, то вместо строчек, которые я закомментировал:
vector<string> players{ "Иванов", "Петров", "Сидоров" }; // создание списка участников
circle(players); // вызов метода
надо написать что-то типа такого (я оставил этот вариант по умолчанию)
*/
vector<string> players;
string buffer = "";
cout << "Вводите фамилии участников. "
<< "По окончании ввода введите пустую строку" << endl;
do
{
getline(cin, buffer);
if (buffer.size() > 0)
{
// Добавление элемента в конец вектора
players.push_back(buffer);
}
} while (buffer != "");
circle(players); // вызов
/* Если вдруг понадобится случайная сортировка, то можно сделать что-то типа такого:
добавить инклюды
#include <algorithm>
#include <random>
в самом начале метода circle написать примерно такое:
auto engine = default_random_engine{};
shuffle(begin(players), end(players), engine);
если компилятор заругается, то вот так:
инклюд в начале
#include <algorithm>
перемешивание в самом начале метода circle
random_shuffle(players.begin(), players.end());
или перегрузить метод circle()
*/
system("pause");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment