回转顺序打印矩阵的改进算法

原题目见:http://blog.csdn.net/aegeaner/article/details/6744011

如果使用二维数组,空间复杂度为O(N^2),事实上本题可以计算A[i][j]的通项公式,这样可以不用额外的矩阵存储空间,空间复杂度降为O(1)。

思想是考虑从左上角开始的i*i子矩阵,只要在子矩阵扩张的外围补充(i*i+1)~(i+1)*(i+1)的序列即可。又可以看做是(i+1)^2加上一个修正值(负数)序列。而对角线上的修正值正好是层数的相反数,以此左右上下增减即可。这个技巧主要是利用了对称。

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;

int Layer(int i, int j)
{
    return max(i, j);
}

int Fix(int i, int j, int n)
{
    int flag;
    if(n % 2 == 0)
        flag = -1;
    else
        flag = 1;
   // if(i == j)
   //    return -n;
   // else
    return -n + flag * (i - j);
}

int main()
{
    int N;
    while(scanf("%d", &N) != EOF)
    {
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < N; j++)
            {
                int n = Layer(i, j);
                printf("%4d ", (n + 1) * (n + 1) + Fix(i, j, n));
            }
            putchar('\n');
        }
    }
    return 0;
}


你可能感兴趣的:(算法,存储,layer)