juli (caladri) wrote in dailysrc,
juli
caladri
dailysrc

Matrix zig-zag: Now in recursive, templated, C++, point-pair form!

struct pair {
    int row;
    int column;
};

/*
* Zig-Zag through an array that is w columns and h rows.  Find the stepth item in the series.
*/
template<size_t w, size_t h>
pair
zigzag(unsigned step, int i = 0, int j = 0, bool left = false)
{
    if (step-- == 0) {
        pair p = { j, i };
        return p;
    }
    if (i == 0 && j == 0) {
        ++i;
        return zigzag<w, h>(step, i, j, left);
    }
    if (!left) {
        if (j + 1 < h && i > 0) {
            --i;
            ++j;
            return zigzag<w, h>(step, i, j, false);
        }
        if (j + 1 == h) {
            ++i;
        } else if (i == 0) {
            ++j;
        }
        return zigzag<w, h>(step, i, j, true);
    } else {
        if (i + 1 < w && j > 0) {
            --j;
            ++i;
            return zigzag<w, h>(step, i, j, true);
        }
        if (i + 1 == w) {
            ++j;
        } else if (j == 0) {
            ++i;
        }
        return zigzag<w, h>(step, i, j, false);
    }
}
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

  • 0 comments