C++基础(打印N*N螺旋矩阵)

C++基础(打印N*N螺旋矩阵),第1张

C++基础(打印N*N螺旋矩阵),第2张

C/C++面试算法系列——打印N*N螺旋矩阵
VIA和EMC都写过这个测试
输入N,打印N*N矩阵
比如N = 3, 和打印:
1 2 3
8 9 4 [/br打印:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
/*螺旋矩阵*/
# include[# define down 1
# define left 2
# define up3
/n * n矩阵[] I < n;i++)
{
for(j = 0;j < n;j++)
{
printf("%4d ",a[I][j]);
}
printf(" \ n ");
}
}
void螺旋矩阵(int * a [],int n)//int * a []注意界面设计
{
int i,j;//坐标
int count;//counter
int k;//循环变量控制每边点数
int direct;//方向指示,控制行的增减
I = 0;//起点(0,0)
j = 0;
count = 1;
direct = RIGHT;
while (n > 1) //是平方,具有以下代码
{
for(k = 0;k < n-1;++)//每边点数为(2n+2(n-2))/4 = 4(n-1)/4 = n-1
{
A[I][j]= count++;
switch(direct)
{
case DOWN:
i++;
break;
案例左:
j-;
break;
case UP:
I-;
break;
case RIGHT:
j++;
break;
}
}
/如果刚刚通过的方向是向上的,则四边填充,步长减少2,位置
If(direct = = UP)
{
i++;
j++;
n-= 2;
}
/更改方向
direct =(direct+1)% 4;
}
if (n == 1) //离群值
{
a[I][j]= count;
}
}
void螺旋矩阵2 (int * a [],int n)//int * a []注意接口的设计
{
int k = 0,i = 0,j = 0;
int count = 1;
//提示:注意I和j的变化,画个图就明白了。按照螺旋矩阵的顺序赋值就行了!for(;k <(n+1)/2;k++)
{
while(j < n-k)a[I][j++]= count++;i++;j-;///上面一行
while(I < n-k)a[i++][j]= count++;I-;j-;///右列
while(j > k-1)a[I][j-]= count++;I-;j++;///下面一行
while(I > k)a[I-][j]= count++;i++;j++;///左边一列
}
}
这种方法每个while中的循环条件都不一样,ij在每个edge之后都需要重新校正,比前面的方法更复杂
。递归方式,稍微改变一下spiralMatrix,同时注意下一轮递归的条件和上一次退出的条件
Examda提示:相应改变递归方式的函数接口
/*
* matrix 2D矩阵array
*(x,Y):第一个元素的坐标
* start:第一个元素的值
* width:矩阵的大小和宽度
void螺旋矩阵3 (int * matrix//循环变量
int direct;//方向指示
if(宽度返回;
if (width == 1) {//当矩阵大小为1时,奇数
matrix[x][y]= start;
退货;
}
I = 0;
j = 0;
direct = RIGHT;
while(direct< UP+1) //走一次,exit
{
for(k = 0;k <宽度-1;k++)
{
matrix[x+I][y+j]= start++;
switch(direct)
{
case DOWN:
i++;
break;
案例左:
j-;
break;
case UP:
I-;
break;
case RIGHT:
j++;
break;
}
}
direct++;
}
/跑完一圈,减少2步,修正位置
i++;
j++;
width-= 2;
spiralMatrix(矩阵,x+i,y+j,宽度,开始);//继续填充
}
void main(void)
{
int m[n][n]= { 0 };
int * a[N];
int I;
for(I = 0;I < N;i++)
{
a[I]= m[I];//不能直接拿二维数组当参数,和指针
}
/SpiralMatrix (a,n)的本质不同;
//spiralMatrix2(a,N);
spiralMatrix3(a,0,0,N,1);
printMatrix(a,N);
printf("按任意键退出...");
getch();
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++基础(打印N*N螺旋矩阵)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情