#include <iostream>

using namespace std;

struct Point {
    const int q_, r_;
    Point(int q, int r) : q_{q}, r_{r} {}
    inline void print() {
        cout << "q:" << q_ << ", r:" << r_ << endl;
    }
};

class PointMap {
public:
    const int RADIUS;

    PointMap(int radius) : RADIUS{radius} {
        points = new Point**[2 * RADIUS + 1];
        for (int q = -RADIUS; q <= RADIUS; ++q) {
            int r1 = max(-RADIUS, -q - RADIUS);
            int r2 = min(RADIUS, -q + RADIUS);
            points[RADIUS + q] = new Point*[2 * RADIUS + 1]; // r2 - r1 + 1];
            for (int r = r1; r <= r2; ++r) {
                points[RADIUS + q][RADIUS + r] = new Point(q, r);
                points[RADIUS + q][RADIUS + r]->print();
            }
        }
        cout << "*** Ready constuctor ***\n\n";
    }

    ~PointMap() {
        cout << "*** Delete Map ***\n\n";
        for (int q = -RADIUS; q <= RADIUS; ++q) {
            int r1 = max(-RADIUS, -q - RADIUS);
            int r2 = min(RADIUS, -q + RADIUS);
            for (int r = r1; r <= r2; ++r) {
            	points[RADIUS + q][RADIUS + r]->print();
                delete points[RADIUS + q][RADIUS + r];
            }
            delete[] points[RADIUS + q];
        }
        delete[] points;
    }

    void print(int row, int col) {
        points[RADIUS + row][RADIUS + col]->print();
    }

private:
    Point*** points;
};

// class PointMap {
// public:
//     const int DIMENSION;

//     PointMap(int d) : DIMENSION{d} {
//         points = new Point**[DIMENSION];
//         for (int i = 0; i < DIMENSION; ++i) {
//             points[i] = new Point*[i + 1];
//             for (int j = 0; j < i + 1; ++j) {
//                 points[i][j] = new Point(i, j);
//                 points[i][j]->print();
//             }
//         }
//         cout << "*** Ready constuctor ***\n\n";
//     }

//     ~PointMap() {
//         cout << "*** Delete Map ***\n\n";
//         for (int i = 0; i < DIMENSION; ++i) {
//             for (int j = 0; j < i + 1; ++j) {
//                 delete points[i][j];
//             }
//             delete[] points[i];
//         }
//         delete[] points;
//     }

//     void print(int row, int col) {
//         points[row][col]->print();
//     }

// private:
//     Point*** points;
// };

int main() {
    ios::iostate status;
    while (true) {
        int DIMENSION;
        cout << "Radius (STR+D = Ende):";
        cin >> DIMENSION;
        status = cin.rdstate();
        if (cin.eof()) break;
        if (status) {
            cin.clear();
            cin.get();
        }
        else {
            PointMap* map = new PointMap(DIMENSION);
            // Hexagonale Map
            for (int q = -DIMENSION; q <= DIMENSION; ++q) {
                int r1 = max(-DIMENSION, -q - DIMENSION);
                int r2 = min(DIMENSION, -q + DIMENSION);
                for (int r = r1; r <= r2; ++r) map->print(q, r);
            }

            // Dreieck Map
            // for (int i = 0; i < DIMENSION; ++i) {
            //     for (int j = 0; j < i + 1; ++j) map->print(i, j);
            // }
            delete map;
            cout << "*** main function ***\n\n";
        }
    }
}