如何以螺旋顺序打印数字?

时间:2014-01-04 20:00:43

标签: matrix

谢谢你, 我正在尝试解决一个项目的欧拉问题,它要我打印

的总和
21 22 23 24 25
20  7  8  9 10
19  6  1  2 11
18  5  4  3 12
17 16 15 14 13

这是通过从数字1开始并向顺时针方向向右移动5×5矩阵形成的,但我在编写螺旋矩阵的代码时遇到了麻烦!!

3 个答案:

答案 0 :(得分:0)

强烈建议您自己做项目欧拉问题,如果真的被困,请寻求帮助

这里是我将如何在c中编写代码来打印螺旋,如问题

中所示
#include<stdio.h>
main()
{
int i,j,nq=9;//nq is a odd number which represents the order of the matrix
int lim=(int)nq/2,cnt=2;
int a[nq][nq];
 for(i=0;i<nq;i++){
    for(j=0;j<nq;j++)
    a[i][j]=0;
    }
a[lim][lim]=1;
a[lim][lim+1]=2;
int i1=lim,j1=lim+1;i=lim,j=lim;
while(1){
       if(cnt>(nq*nq))
         break;
        cnt++;
if(i==i1)
{  j=j1;
   if(i<=lim)
   {
       i=i1;
    if(a[i1+1][j1]==0)
        a[++i1][j]=cnt;
    else
       a[i1][++j1]=cnt;
   }
   else
   {   i=i1;
    if(a[i1-1][j1]==0)
       a[--i1][j1]=cnt;
    else
        a[i1][--j1]=cnt;
   }
}
else
{   i=i1;
    if(j<lim)
   {
        j=j1;
       if(a[i1][j+1]==0)
        a[i1][++j1]=cnt;
       else
        a[--i1][j1]=cnt;
   }
   else
   {    j=j1;
       if(a[i1][j1-1]==0)
        a[i1][--j1]=cnt;
       else
        a[++i1][j1]=cnt;
   }
  }
}
for(i=0;i<nq;i++){
    for(j=0;j<nq;j++)
    printf(" %d    ",a[i][j]);
    printf("\n");
}

}

我用Google搜索了你的问题http://projecteuler.net/problem=28这也可以通过利用其数学性质的说明来解决

右上角是n ^ 2 其他角可以显示为n ^ 2-2n + 2,n ^ 2-n + 1和n ^ 2-3n + 3。你只需要将那些角落归结为

  

= 4 * n ^ 2 - 6 * n + 6

因此,可以通过迭代从1001到3

的每秒数来计算最终答案
long int sum(int n){
    long int sum=1;
    while(n>1){
      sum=sum+4*n*n-6*n+6;
      n=n-2;
    }
    return sum;
    } 

答案 1 :(得分:0)

我不知道你是否真的要打印螺旋,但请参阅下面的我在Python 2.7中编写的#28解决方案。

l = [1]
def corners(step,l):
    counter = 0
    while counter < 4:
        l.append(max(l)+step)
        counter +=1
    return l

step = 2
while step < 1001:
    l = corners(step, l)
    step += 2

print sum(l)

答案 2 :(得分:0)

    void printSpiral(int A[3][5],int m, int n)
{
    int T=0; int B=m-1; int L=0; int R=n-1;
    int dir=0;
    int i =0; int j=0; int k=0; int l=0;
    while(T<=B && L<=R)    
    {
        //printf("dir %d ",dir);
        if(dir == 0)
        {
        for( i=L;i<=R;i++)
        {
        printf("%d ",A[T][i]);
        //printf("\n");
        }
        T++;
        dir=1;  
        }
        else if(dir == 1)
        {
          //  printf("%d R ",R);
        for( j=T;j<= B;j++)
        {
        printf("%d ",A[j][R]);
        //printf("\n");
        //printf("dir1");
        }
        dir=2;
        R--;
        }
        else if(dir == 2)
        {
        for(k=R;k>= L;k--)
        {
        printf("%d ",A[B][k]);
        }
        dir=3;
        B--;
        }
        else if(dir == 3)
        {
        for( l=B;l>= T;l--)
        {
            printf("%d ",A[l][L]);
        }
        L++;
        dir=0;
        }    
    }
}