现在的位置: 首页 > 综合 > 正文

打印蛇形矩阵

2018年02月07日 ⁄ 综合 ⁄ 共 693字 ⁄ 字号 评论关闭

题目:

对于给定的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.
}

抱歉!评论已关闭.