求螺旋矩阵指定坐标的值

螺旋矩阵定义:螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。


坐标(4,3)对应的数字为34。

请定义一个函数,输入n,x,y(n为螺旋矩阵的阶数,x,y分别x轴、y轴坐标),返回n阶螺旋矩阵坐标(x,y)对应的数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#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;
}




      本文转自FrankNie0101 51CTO博客,原文链接:http://blog.51cto.com/frankniefaquan/1965846,如需转载请自行联系原作者







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值