#include <stdio.h>
#include <memory.h>
#include <malloc.h>

void buildSnailReverse(int* a, int w, int h)
{
    int s=w*h,n=0,d=h>w,r=2*d+1,v[4]={1,w,-1,-w},m=(d?w:h)-1;
    a+=m/2*(w+1);
    for(w=(d?h:w)-m;n<s;a+=v[d])*a=++n,n>w&&!a[v[h=d+r&3]]?d=h:0;
}

void printArray(int* a, int w, int h)
{
    int i, j;
    for (i = 0; i < h; ++i) {
        for (j = 0; j < w; ++j) {
            printf("%2d ", a[i * w + j]);
        }
        printf("\n");
    }
    printf("\n");
}

void makeAndPrintSnail(int w, int h)
{
    int *a;
    a = (int*)calloc(w * h, sizeof(int));
    buildSnailReverse(a, w, h);
    printArray(a, w, h);
    free(a);
}

int main()
{
    makeAndPrintSnail(4,4);
    makeAndPrintSnail(5,5);
    makeAndPrintSnail(6,6);

    makeAndPrintSnail(3,10);
    makeAndPrintSnail(4,10);
    makeAndPrintSnail(5,10);
    makeAndPrintSnail(6,10);
    makeAndPrintSnail(7,10);
    makeAndPrintSnail(8,10);
    makeAndPrintSnail(9,10);

    makeAndPrintSnail(3,11);
    makeAndPrintSnail(4,11);

    makeAndPrintSnail(10,3);
    makeAndPrintSnail(10,4);
    makeAndPrintSnail(10,5);
    makeAndPrintSnail(10,6);
    makeAndPrintSnail(10,7);
    makeAndPrintSnail(10,8);
    makeAndPrintSnail(10,9);

    makeAndPrintSnail(11,3);
    makeAndPrintSnail(11,4);
    return 0;
}