螺旋矩阵

int i=5;
1  2  3  4  5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

int i=6
1  2  3  4  5   6
20 21 22 23 24  7
19 32 33 34 25  8
18 31 36 35 26  9
17 30 29 28 27 10
16 15 14 13 12 11

 

 

偶然间看到这个题目,貌似年代比较古老,首先要找到打印数字的规律,首先想到的是不断变化相应的x和y的值,然后用个变量表示所能打印到的最大值,到了这个最大值再变换x,y的值,当然还要标识当前是那个变量在变化,且是增大还是减小,这么一想就复杂了。复杂说明没有把握更本质的东西,

我再看,对于每个 位置的赋值,这个位置的坐标x,y其实是依赖刚刚赋值的那个坐标,x+1,y=y;x=x,y+1;x-1;y=y;等等,可以看到,每次赋值就步进三个数字 –1 0 1 恩,那这三个数字是怎么组合的呢,在看,

第一行   m=0;n=1

#2   m=1;n=0

# 3   m=0;n=-1

#4  m=-1;n=0

呵呵,奇数次对前一次取反并交换,偶数次只取反。用个变量round表示#i   这个round显然是在某些点变化的,6  11   16    20  24.规律很显然,相差 是 5  5   4  4   3  3,初始值是6的话  奇数次减一,偶数次不变。只要知道了一个初始的turn,下面的都可以迭代的求出来

所以在每个turn处,计算出下个turn以及即将开始的round的编号,然后根据round计算出在这个round里面x,y的步进值,

 

#include <stdio.h>
#include <stdlib.h>

int main(){
    int t;
    scanf("%d",&t);
    int* matrix=new int[t*t];
    int round=1,turn=t,i=0,j=0,m=0,n=1,acc=t;
    for(int k=1;k<t*t+1;++k){
        matrix[(i)*t+(j)]=k;
        if(k==turn){
            if(round%2==1){
                acc--;
            }
            turn=turn+acc;
            round++;
            if(round%2==1){

               swap(m,n);
                m=-m;
                n=-n;
            }
            else{
               swap(m,n);

            }
        }
        i=i+m;
        j=j+n;
    }
    for(int i=0;i<t;i++){
        for(int j=0;j<t;j++){
            printf("%d ",matrix[i*t+j]);
        }
        printf("\n");
    }
    return 0;
}

posted @ 2010-05-30 13:26  donj  阅读(1531)  评论(0编辑  收藏  举报