Здравствуйте, напишите пожалуйста программу на c++, которая создает граф всех возможных состояний головоломки "Ханойская башня", где узлы графа это состояния cистемы колышков, а ребра являются перестановками дисков и потом по этому же графу ищет наикратчайший путь до выигрышного состояния. Изначально есть 3 колышка и n-количество дисков, которое задает пользователь, все диски находятся на колышке А, задача состоит в том, чтобы переставить все диски с колышка А на колышек С.
ОЧЕНЬ НАДО, Я ДАЖЕ БЕЗ ПОНЯТИЯ КАК ЭТО РЕАЛИЗОВАТЬ!
C/C++
Помогите, пожалуйста, написать программу по нижеописанной задаче!
#include
#include
#include
#include
using namespace std;
// Структура, представляющая состояние системы колышков
struct State {
vector pegs; // Колышки
string move; // Ход, приведший к данному состоянию
State(const vector& p, const string& m) : pegs(p), move(m) {}
};
// Функция для создания всех возможных состояний головоломки "Ханойская башня"
vector generateStates(const State& state) {
vector nextStates;
const vector& pegs = state.pegs;
int numPegs = pegs.size();
for (int from = 0; from < numPegs; ++from) {
for (int to = 0; to < numPegs; ++to) {
if (from != to && !pegs[from].empty()) {
vector newPegs = pegs;
int disk = newPegs[from].back();
newPegs[from].pop_back();
newPegs[to].push_back(disk);
string move = "Move disk " + to_string(disk) + " from peg " + to_string(from) + " to peg " + to_string(to);
nextStates.push_back(State(newPegs, move));
}
}
}
return nextStates;
}
// Функция для проверки, является ли состояние выигрышным
bool isWinningState(const State& state, int numDisks, int winPeg) {
return state.pegs[winPeg].size() == numDisks;
}
// Функция для поиска наикратчайшего пути до выигрышного состояния
string findShortestPath(int numPegs, int numDisks, int winPeg) {
vector initialPegs(numPegs);
for (int i = numDisks; i >= 1; --i) {
initialPegs[0].push_back(i);
}
State initialState(initialPegs, "");
queue q;
q.push(initialState);
unordered_set visited;
visited.insert("");
while (!q.empty()) {
State currState = q.front();
q.pop();
if (isWinningState(currState, numDisks, winPeg)) {
return currState.move;
}
vector nextStates = generateStates(currState);
for (const State& nextState : nextStates) {
if (visited.find(nextState.move) == visited.end()) {
q.push(nextState);
visited.insert(nextState.move);
}
}
}
return "No solution found.";
}
int main() {
int numPegs, numDisks;
cout > numPegs;
cout > numDisks;
cout
Коля Сакалы
А почему для одного диска решение всегда находится, а для двух уже нет, делал 20 запусков с вводом количества дисков 2, и во всех таких запусках появлялось сообщение "No solution found"?
Коля Сакалы
Спасибо, я немного переделал код, но без твоей помощи, не знал бы что делать))
Сергей Костюков
https://cloud.mail.ru/public/RDKD/GW9qM6hTG
Для создания графа необходимо определить его вершины и ребра. Вершины могут быть представлены как узлы, а ребра - как связи между узлами.
Способы создания графа:
1. Матрица смежности: это квадратная матрица, в которой строки и столбцы представляют вершины графа, а элементы указывают на наличие или отсутствие ребер между вершинами.
2. Список смежности: это список вершин, каждая из которых связана со списком ее соседних вершин.
3. Объектно-ориентированный подход: здесь каждая вершина и ребро представлены отдельными объектами, которые могут иметь свои собственные свойства и методы.
После создания графа можно использовать различные алгоритмы для его анализа, такие как поиск в глубину, поиск в ширину, алгоритм Дейкстры и т.д.
Способы создания графа:
1. Матрица смежности: это квадратная матрица, в которой строки и столбцы представляют вершины графа, а элементы указывают на наличие или отсутствие ребер между вершинами.
2. Список смежности: это список вершин, каждая из которых связана со списком ее соседних вершин.
3. Объектно-ориентированный подход: здесь каждая вершина и ребро представлены отдельными объектами, которые могут иметь свои собственные свойства и методы.
После создания графа можно использовать различные алгоритмы для его анализа, такие как поиск в глубину, поиск в ширину, алгоритм Дейкстры и т.д.
Коля Сакалы
Так вопрос не в том, что нужно сделать, а как нужно сделать
Похожие вопросы
- Помогите пожалуйста написать программу на Си
- Помогите пожалуйста написать программу!
- Помоги пожалуйста написать программу на C++
- Помогите пожалуйста написать программу на С++
- Помогите пожалуйста написать программу, реализующую десять генераторов псевдослучайных чисел.СИ!!!!
- Помогите пожалуйста, написать программу в С++
- Помогите, пожалуйста, написать программу на языке Си.
- Помогите пожалуйста написать программу небольшую в C++. Одномерный массив
- Помогите пожалуйста написать программу на C++. Очень нужно!
- Помогите пожалуйста написать программу на C++. Срочно нужно, пожалуйста.