题目:
对于给定的n,打印出如下型式的蛇形矩阵。例如
n=3时输出:
1 2 3
8 9 4
7 6 5
n=4时输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
用一个矩阵保存需要输出的数字,使用递归,每次计算最外层的数字。直到只剩下1列或者2列。
使用一维数组保存方阵。参数n表示n*n的方阵,参数m表示每次计算的是m*m的小方阵,a是小方阵的第一个元素地址,小方阵的第一个数字是s。
void fun(int *a, int n,int m, int s) { if(n<=0||m<=0) return; if(m==1)//只有一个数 { a[0] = s; return; } if(m==2)//只有2行2列时 { a[0] = s; a[1] = s+1; a[n*(m-1)+1] = s+2; a[n*(m-1)] = s+3; return ; } int v=s;///起始的数值 for(int i=0; i<m; i++,v++)//→ 第一行,向右,最简单 { a[i] = v ;//a[0][i] } for(int i=1, t=n; i<m; i++,v++,t+=n)//↓最外层向下的列,注意每增加行号加1时,地址+n { a[m-1+t] = v;//a[i][m-1] } for(int i=m-2,t=(m-1)*n;i>=0;i--,v++)//←最后一行,向左 { a[t+i] = v;//a[m-1][i] } for(int i=m-2,t=(m-2)*n;i>0;i--,v++,t-=n)//↑最外层,向上的列,行号减1时地址-n。 { a[t] = v; //a[i][0] } fun(a+n+1,n,m-2,v);//递归求解里面的小方阵。注意小方阵起始地址增加了n+1,列数减少了2. }