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

void buildSnailReverse(int* a, int w, int h)
{
    int s=w*h,n=0,d=0,j,i=s-w,r=3;
    int v[4]={1,w,-1,-w};
    while(n<s) {
        a[i]=s-n++;
        j=i+v[d];
        if(j<0||j>=s||(!d%2&&i/w!=j/w)||a[j]) d=d+r&3;
        i+=v[d];
    }
}

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(3,3);
    makeAndPrintSnail(4,4);
    makeAndPrintSnail(5,5);
    makeAndPrintSnail(6,6);

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

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