spiral matrix

本文介绍了一个生成特定旋转矩阵的算法,该算法通过计算不同层的矩阵元素值来构造整个矩阵。文章提供了完整的C语言实现代码,并讨论了如何优化计算过程。

如图,生成如此旋转的矩阵 输入行N,列M,求上述矩阵

假定 纵向为x轴,横向为y轴,从1开始

层数 k=min(i,j,N+1-i,M+1-j)

k层矩阵的长 l=N-(k-1)*2  宽 w=M-(k-1)*2

矩阵左上角的坐标值为(k,k),根据外层矩阵的长宽可以算出数值,进而确定当前矩阵(i,j)的值

 

缺点 :代码中有很多重复计算,可以通过记录一些值来减少计算次数

#include<stdio.h>

#define min(x,y) (x)>(y)?(y):(x)
int N,M;
int foo(int,int);

int main()
{

    while(scanf("%d %d",&N,&M)==2)
        for(int i=1;i<=N;i++)
        {
            for(int j=1;j<=M;j++)
            {
                printf("%3d ",foo(i,j));
            }
            printf("\n");
        }
}



int foo(int i,int j)
{
    int k=min( min(i,j) , min(N+1-i,M+1-j) );
    int l=N-(k-1)*2, w=M-(k-1)*2;
    int s=0;
    
    for( int t=1;t<k;t++ )
    {
        int l=N-(t-1)*2, w=M-(t-1)*2;
        s+=(l-1)*2+(w-1)*2;
    }
    s++;
    
    if(l==1) s+=j-k;
    else if(w==1) s+=i-k;
    else
    {
        if(i==k) s+=j-k;
        else if(j==k+w-1) s+=w-1+i-k;
        else if(i==k+l-1) s+=w-1+l-1+k+w-1-j;
        else s+=w-1+l-1+w-1+k+l-1-i;
    }
    return s;
}

 

转载于:https://www.cnblogs.com/DanielOwen/p/5833345.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值