#include "TorreHanoiGioco.h"
//template<size_t N>
//void solve(vict::TorreHanoiGioco<N>& torre);
void solve(vict::TorreHanoiGioco<3>& torre)
{
constexpr size_t S = vict::TorreHanoiGioco<3>::sorgente;
constexpr size_t A = vict::TorreHanoiGioco<3>::ausiliario;
constexpr size_t D = vict::TorreHanoiGioco<3>::destinazione;
// esempio
torre.mossa(S, D);
torre.mossa(S, A);
torre.mossa(D, A);
torre.mossa(S, D);
torre.mossa(A, S);
torre.mossa(A, D);
torre.mossa(S, D);
}
int main()
{
constexpr size_t N = 3;
vict::TorreHanoiGioco<N> torre;
solve(torre);
std::cout << "problema " << (torre.check() ? "" : "non ") << "risolto in "
<< torre.numero_mosse() << " mosse." << std::endl;
}
#pragma once
#include "stack-fixed.h"
#include <iostream>
#include <cstdint>
namespace vict
{
template <size_t N>
class TorreHanoiGioco
{
public:
TorreHanoiGioco() : _mosse(0) {
for (size_t i = N; i != 0; --i)
{
_pali[sorgente].push(i);
}
};
bool mossa(size_t i, size_t j)
{
bool res = false;
if (i < N && j < N)
{
size_t li = _pali[i].last_or(N + 1);
size_t lj = _pali[j].last_or(N + 1);
if (li < lj) { res = mossa_internal(i, j); }
else if (li > lj) {
res = mossa_internal(j, i);
}
}
if (!res)
{
std::cout << "Mossa non valida tra " << i << " e " << j << std::endl;
}
return res;
}
size_t numero_mosse()
{
return _mosse;
}
bool check()
{
if (!_pali[destinazione].full()) return false;
size_t* arr = _pali[destinazione].get_data();
for (size_t i = 0; i != N; ++i)
{
if (*(arr + i) != N - i) return false;
}
return true;
}
static size_t constexpr sorgente = 0;
static size_t constexpr ausiliario = 1;
static size_t constexpr destinazione = 2;
private:
bool mossa_internal(size_t i, size_t j)
{
size_t elem;
if (!_pali[i].pop(elem)) return false;
if (!_pali[j].push(elem)) return false;
std::cout << "Mosso da " << i << " in " << j << std::endl;
_mosse++;
return true;
}
FixedStack<size_t, N> _pali[3];
size_t _mosse = 0;
};
}
#pragma once
#include <cstddef>
namespace vict {
template < typename T, size_t N >
class FixedStack
{
public:
FixedStack() noexcept : _end(0) {};
~FixedStack() = default;
// not copyable
FixedStack(const FixedStack&) = delete;
FixedStack& operator=(const FixedStack&) = delete;
size_t num_entry() noexcept
{
return _end;
}
bool push(T element) noexcept
{
if (full())
return false;
_data[_end] = std::move(element);
_end++;
return true;
}
bool pop(T& element) noexcept
{
if (empty())
return false;
element = _data[--_end];
return true;
}
bool last(T& element)
{
if (empty())
return false;
element = _data[_end - 1];
return true;
}
T last_or(T value = T()) noexcept
{
return empty() ? value : _data[_end - 1];
}
T* get_data()
{
return &_data[0];
}
bool empty() noexcept
{
return _end == 0;
}
bool full() noexcept
{
return _end == N;
}
private:
T _data[N];
size_t _end;
};
} // namespace vict
Visitano il forum: Nessuno e 1 ospite