螺旋矩阵
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;
}