螺旋矩陣定義:螺旋矩陣是指一個呈螺旋狀的矩陣,它的數字由第一行開始到右邊不斷變大,向下變大,向左變大,向上變大,如此循環。
座標(4,3)對應的數字爲34。
請定義一個函數,輸入n,x,y(n爲螺旋矩陣的階數,x,y分別x軸、y軸座標),返回n階螺旋矩陣座標(x,y)對應的數字。
#include<stdio.h> #include<assert.h> #define MIN(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; }) int getPointValue(int n, int _x, int _y); int main(){ int size = 0, x = 0, y = 0; printf("Please input 3 integers as the size, x and y of a 2-dimension matrix.\n"); scanf(" %u %u %u", &size, &x, &y); int result = getPointValue(size, x, y); return 0; } int getPointValue(int n, int _x, int _y){ assert(_x >= 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<minIdx; ++i){ sval += (ulimit - i * 2) * 4; } maxIdx = ulimit - minIdx; if(y == minIdx){ result = sval + x - minIdx; } else if(x == maxIdx){ result = sval + (maxIdx - minIdx) + ( y - minIdx); } else if(y == maxIdx){ result = sval + (maxIdx - minIdx) * 2 + maxIdx - x; } else if (x == minIdx){ result = sval + (maxIdx - minIdx) * 3 + maxIdx - y; } else assert(0); printf("f(%u,%u,%u)=%u\n", n, _x, _y, result); return result; }