#include <iostream>
template<int src, int dst>
struct move_disc
{
move_disc() {
std::cout << "move " << src << " to " << dst << "\n";
}
};
template<int n, int src, int tmp, int dst>
struct hanoi
{
hanoi<n-1, src, dst, tmp> before;
move_disc<src, dst> disc; // normal member
hanoi<n-1, tmp, src, dst> after;
};
template<int src, int tmp, int dst>
struct hanoi<0, src, tmp, dst>
{
// recursive base case
};
int main() {
hanoi<3, 1, 2, 3> go;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8aW50IHNyYywgaW50IGRzdD4Kc3RydWN0IG1vdmVfZGlzYwp7Cgltb3ZlX2Rpc2MoKSB7CgkJc3RkOjpjb3V0IDw8ICJtb3ZlICIgPDwgc3JjIDw8ICIgdG8gIiA8PCBkc3QgPDwgIlxuIjsKCX0KCn07Cgp0ZW1wbGF0ZTxpbnQgbiwgaW50IHNyYywgaW50IHRtcCwgaW50IGRzdD4Kc3RydWN0IGhhbm9pCnsKICAgIGhhbm9pPG4tMSwgc3JjLCBkc3QsIHRtcD4gYmVmb3JlOwogICAgbW92ZV9kaXNjPHNyYywgZHN0PiBkaXNjOyAgICAgICAgICAvLyBub3JtYWwgbWVtYmVyCiAgICBoYW5vaTxuLTEsIHRtcCwgc3JjLCBkc3Q+IGFmdGVyOwp9OwoKdGVtcGxhdGU8aW50IHNyYywgaW50IHRtcCwgaW50IGRzdD4Kc3RydWN0IGhhbm9pPDAsIHNyYywgdG1wLCBkc3Q+CnsKICAgIC8vIHJlY3Vyc2l2ZSBiYXNlIGNhc2UKfTsKCgppbnQgbWFpbigpIHsKCWhhbm9pPDMsIDEsIDIsIDM+IGdvOwp9