スパイラルマトリクス指定座標の値を求める


スパイラルマトリクス定義:スパイラルマトリクスとは、1行目から右側に大きくなり、下に大きくなり、左に大きくなり、上に大きくなるスパイラルマトリクスを指します.
座標(4,3)に対応する数字は34です.
関数を定義し、n,x,y(nはスパイラルマトリクスの次数、x,yはそれぞれx軸、y軸座標)を入力し、n次スパイラルマトリクス座標(x,y)に対応する数値を返します.
#include
#include
#define MIN(x, y) ({        \
  typeof(x) _min1 = (x);      \
  typeof(y) _min2 = (y);      \
  (void) (&_min1 == &_min2);    \
  _min1 = 1 && _x <= n);
    assert(_y >= 1 && _y <= n);
    const int ulimit = n - 1, x = _x - 1, y = _y - 1;
    int i, minIdx = -1, maxIdx = -1;
    int sval = 0, result = 0;
    minIdx = MIN( MIN(x, ulimit - x), MIN(y, ulimit - y) );
    sval = 1;
    for(i=0; i