/* -*- coding: utf-8 -*- * * 3734.cc: No.3734 No Flat Notes - yukicoder */ #include #include #include using namespace std; /* constant */ const int MAX_H = 500; const int MAX_W = 500; const int MAX_HW = MAX_H * MAX_W; /* typedef */ /* global variables */ int ps[MAX_HW], as[MAX_HW]; /* subroutines */ void forward(int w, int &y, int &x, int &dx) { x += dx; if (x >= w) x = w - 1, dx = -1, y++; else if (x < 0) x = 0, dx = 1, y++; } bool check(int h, int w, int m) { int dxs[] = {1, 0, -1, 0}, dys[] = {0, -1, 0, 1}; int yc = 0, tc = 0; for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) { int nbc = 0, lc = 0, gc = 0; for (int di = 0; di < 4; di++) { int vy = y + dys[di], vx = x + dxs[di]; if (vy >= 0 && vy < h && vx >= 0 && vx < w) { nbc++; if (as[vy * w + vx] < as[y * w + x]) lc++; else gc++; } } if (nbc == lc) yc++; else if (nbc == gc) tc++; } printf(" check(%d,%d,%d) = %d,%d\n", h, w, m, yc, tc); return yc == m && tc == m; } /* main */ int main() { int h, w, m; scanf("%d%d%d", &h, &w, &m); int hw = h * w; int t = hw - m * 2; if (m <= 0 || m * 2 > hw || ((hw & 1) && t <= 1)) { puts("-1"); return 0; } for (int i = 0, y = 0, x = 0, dx = 1; i < hw; i++) { ps[i] = y * w + x; forward(w, y, x, dx); } int mn = 1, mx = hw, k = 0; if (h > 1 && w > 1 && (hw & 1) && t <= w * 2 - w) { for (int i = 0; i < m; i++) { as[ps[k++]] = mn++; as[ps[k++]] = mx--; } as[ps[k++]] = mn + 1; as[ps[k++]] = mn; mn += 2; while (k < hw) as[ps[k++]] = mn++; } else { for (int i = 1; i < m; i++) { as[ps[k++]] = mn++; as[ps[k++]] = mx--; } while (k < hw) as[ps[k++]] = mn++; } for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) printf("%d%c", as[y * w + x], (x + 1 < w) ? ' ' : '\n'); //assert(check(h, w, m)); return 0; }