码迷,mamicode.com
首页 > 其他好文 > 详细

求螺旋矩阵指定坐标的值

时间:2017-09-16 19:02:37      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:c/c++算法

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

坐标(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 getStartPointValue(int minIdx, int ulimit);
int getPointValue(int n, int row, int col);
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 getStartPointValue(int minIdx, int ulimit){
    assert(minIdx >= 0 && minIdx <= ulimit);
    if(minIdx == 0){
        return 1;
    }
    else{
        int new_minIdx = minIdx - 1;
        int new_maxIdx = ulimit - new_minIdx;
        return (new_maxIdx - new_minIdx) * 4 + getStartPointValue(new_minIdx, ulimit); 
    }
}
int getPointValue(int n, int row, int col){
    assert(row >= 1 && row <= n);
    assert(col >= 1 && col <= n);
    const int ulimit = n - 1, x = row - 1, y = col - 1;
    int minIdx = -1, maxIdx = -1;
    int sval = -1, result = -1;
    minIdx = MIN( MIN(x, ulimit - x), MIN(y, ulimit - y) );
    maxIdx = ulimit - minIdx;
    sval = getStartPointValue(minIdx, ulimit);
    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("(%u,%u,%u)=%u\n", n, row, col, result);
    printf("minIdx=%u, maxIdx=%u, sval=%u\n", minIdx, maxIdx, sval);
    return result;
}



本文出自 “用C++写诗” 博客,谢绝转载!

求螺旋矩阵指定坐标的值

标签:c/c++算法

原文地址:http://frankniefaquan.blog.51cto.com/12613979/1965846

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!