Last active
April 26, 2017 04:09
-
-
Save safoyeth/ac7f2c66791f6ac9ee5d9c34fba00e57 to your computer and use it in GitHub Desktop.
Simple circle system algorythm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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