Skip to content

Instantly share code, notes, and snippets.

@lawliet89
Last active January 4, 2016 17:59
Show Gist options
  • Save lawliet89/8657459 to your computer and use it in GitHub Desktop.
Save lawliet89/8657459 to your computer and use it in GitHub Desktop.
Rudimentary Tower of Hanoi Solver
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
void moveDisks(int number, stack<int> &origin, stack<int> &destination, stack<int> &buffer);
void moveTop(stack<int> &origin, stack<int> &destination);
int main() {
cout << "Enter number of disks: ";
int number;
cin >> number;
stack<int> towers[3];
for (int i = number; i > 0; --i){
towers[0].push(i);
}
moveDisks(number, towers[0], towers[1], towers[2]);
for (int j = 0; j < 3; j++) {
if (towers[j].empty()) continue;
for (int i = 0; i < number; ++i) {
cout << towers[j].top() << "\n";
towers[j].pop();
}
break;
}
}
void moveDisks(int number, stack<int> &origin, stack<int> &destination, stack<int> &buffer) {
if (number <= 0) return;
moveDisks(number - 1, origin, buffer, destination);
moveTop(origin, destination);
moveDisks(number - 1, buffer, destination, origin);
}
void moveTop(stack<int> &origin, stack<int> &destination) {
int disk = origin.top();
destination.push(disk);
// You might want to have a better way of saying "moving x form tower y to tower z"
// Probably using a wrapper class around stack for a tower
// I was lazy.
cout << "Moving " << disk << "\n";
origin.pop();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment