// Перевести задачу в состояние выполненной задачи void SetProblemFinish() { problemState = MaxBipartiteMatchingProblemState.ProblemFinish; graphVisInterface.InteractiveMode = InteractiveMode.NonInteractive; graphVisInterface.IsVerticesMoving = false; string message = "Максимальное паросочетание в двудольном графе найдено." + Environment.NewLine + "Задание успешно выполнено!"; ShowSuccessTip(message); if (problemMode == ProblemMode.Solution) { SetAnswerGroupBoxState(false, false, "Принять ответ"); } else if (problemMode == ProblemMode.Demonstration) { SetAnswerGroupBoxState(false, false, "Сделать шаг"); } buttonReloadIteration.Enabled = false; // Отмечаем, что задача решена if (problemMode == ProblemMode.Solution) { maxBipartiteMatchingProblemStatistics.IsSolved = true; Close(); } }
// Перевести задачу в состояние ожидания значения мощности найденного максимального паросочетания private void SetMaxMatchingCardinalityWaitingState() { problemState = MaxBipartiteMatchingProblemState.MaxMatchingCardinalityWaiting; if (problemMode == ProblemMode.Solution) { graphVisInterface.InteractiveMode = InteractiveMode.NonInteractive; graphVisInterface.IsVerticesMoving = false; } string message = ""; if (problemMode == ProblemMode.Solution) { message = "Максимальное паросочетание построено." + Environment.NewLine + "Введите в поле для ответов мощность построенного максимального паросочетания в виде одного целого числа."; } else if (problemMode == ProblemMode.Demonstration) { message = "Максимальное паросочетание построено." + Environment.NewLine + $"Мощность максимального (текущего) паросочетания для этого двудольного графа равна {correctMaximalMatchingCardinality}."; } ShowSuccessTip(message); if (problemMode == ProblemMode.Solution) { SetAnswerGroupBoxState(true, true, "Принять ответ"); } buttonReloadIteration.Enabled = false; }
// Перевести задачу в состояние ожидания вершины для аугментального маршрута private void SetNextPathVertexWaitingState() { problemState = MaxBipartiteMatchingProblemState.NextPathVertexWaiting; if (problemMode == ProblemMode.Solution) { graphVisInterface.InteractiveMode = InteractiveMode.Interactive; graphVisInterface.IsVerticesMoving = true; } string message = ""; if (problemMode == ProblemMode.Solution) { message = "Выберите следующую вершину для аугментального пути." + Environment.NewLine; } else if (problemMode == ProblemMode.Demonstration) { if (curAugmentalPath.Count > 0) { int lastVertexIndex = curAugmentalPath.Last(); message = $"Последней выбрана вершина {lastVertexIndex + 1}." + Environment.NewLine; } } if (curAugmentalPath.Count > 0) { // Формируем строку с текущим аугментальным маршрутом StringBuilder pathStr = new StringBuilder(); foreach (var pathVertex in curAugmentalPath) { pathStr.Append($"{pathVertex + 1}-"); } // Удаляем последнюю чёрточку pathStr.Remove(pathStr.Length - 1, 1); message += $"Текущий аугментальный путь: {pathStr}." + Environment.NewLine; } message += "Жирным выделены рёбра, которые принадлежат текущему паросочетанию. " + "Зелёным при построении аугментальной цепи выделяются рёбра, которые после проведения чередования должны войти в паросочетание. " + "Красным при построении аугментальной цепи выделяются рёбра, которые после проведения чередования должны удалиться из паросочетания." + Environment.NewLine; if (problemMode == ProblemMode.Demonstration) { message += "Нажмите кнопку \"Сделать шаг\", чтобы добавить следующую вершину в строящийся аугментальный путь."; } ShowStandardTip(message); if (problemMode == ProblemMode.Solution) { SetAnswerGroupBoxState(true, false, "Провести чередование"); } else if (problemMode == ProblemMode.Demonstration) { SetAnswerGroupBoxState(true, false, "Сделать шаг"); } buttonReloadIteration.Enabled = true; }
// Перевести задачу в псевдосостояние ожидания чередования по построенному аугментальному пути (для режима демонстрации) private void SetAlternationWaitState() { problemState = MaxBipartiteMatchingProblemState.NextPathVertexWaiting; // Само состояние совпадает с состоянием ожидания очередной вершины string message = "Аугментальная цепь построена." + Environment.NewLine + "Нажмите кнопку \"Сделать шаг\", чтобы провести чередование рёбер по построенному аугментальному пути. " + "При этом рёбра, входящие в паросочетание (выделены жирным и красным), будут удалены из него, " + "а оставшиеся рёбра цепи (выделены зелёным), наоборот, будут добавлены в него. Таким образом мощность паросочетания увеличится на единицу."; ShowSuccessTip(message); SetAnswerGroupBoxState(true, false, "Сделать шаг"); buttonReloadIteration.Enabled = true; }
// ----Методы изменения состояния (этапа) решения задания // Перевести задачу в состояние ожидания начала private void SetStartWaitingState() { problemState = MaxBipartiteMatchingProblemState.StartWaiting; graphVisInterface.InteractiveMode = InteractiveMode.NonInteractive; graphVisInterface.IsVerticesMoving = false; string message = ""; if (problemMode == ProblemMode.Solution) { message = "Добро пожаловать в задание \"Максимальное паросочетание в двудольном графе\"!" + Environment.NewLine + "Ваша задача - найти максимальное паросочетание в представленном двудольном графе и указать его мощность." + Environment.NewLine + "Последовательно стройте аугментальные маршруты и постепенно увеличивайте мощность текущего паросочетания. " + "Для построения чередующихся (аугментальных) цепей последовательно выбирайте вершины маршрута, начав с непокрытой паросочетанием вершины " + "и закончив такой же непокрытой вершиной." + Environment.NewLine + "Если при построении маршрута Вы зашли в тупик, можете сбросить построенный маршрут кнопкой \"К началу итерации\", " + "это не повлияет на оценку." + Environment.NewLine + "Если Вы хотите начать задание заново, нажмите кнопку \"Начать заново\"." + Environment.NewLine + "Если Вы хотите вспомнить тему, откройте текст лекции с помощью кнопки \"Текст лекции\"." + Environment.NewLine + "Чтобы начать решение, нажмите кнопку \"К началу итерации\"."; } else if (problemMode == ProblemMode.Demonstration) { message = "Добро пожаловать в демонстрацию решения задачи \"Максимальное паросочетание в двудольном графе\"!" + Environment.NewLine + "Здесь у Вас есть возможность просмотреть пошаговую демонстрацию решения задачи о максимальном паросочетании " + "в двудольном графе." + Environment.NewLine + "Для того, чтобы сделать очередной шаг решения, нажимайте кнопку \"Сделать шаг\"." + Environment.NewLine + "Вы можете начать итерацию решения заново кнопкой \"К началу итерации\"." + "Если Вы хотите начать задание заново, нажмите кнопку \"Начать заново\"." + Environment.NewLine + "Если Вы хотите вспомнить тему, откройте текст лекции с помощью кнопки \"Текст лекции\"." + Environment.NewLine + "Чтобы начать демонстрацию решения, нажмите кнопку \"К началу итерации\", " + "а затем используйте кнопки \"Сделать шаг\", \"К началу итерации\" и \"Начать заново\" для управления ходом решения."; } ShowSuccessTip(message); if (problemMode == ProblemMode.Solution) { SetAnswerGroupBoxState(false, true, "Принять ответ"); } else if (problemMode == ProblemMode.Demonstration) { SetAnswerGroupBoxState(false, false, "Сделать шаг"); } buttonReloadIteration.Enabled = true; }