螺旋矩阵(c语言实现)

腾讯2016年实习生笔试题

蛇形矩阵,也叫螺旋矩阵,指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,
向左变大,向上变大,如此循环。


/*
思想就是:
螺旋,有四个方向,从左到右,从上到下,从右到左,从下到上。
对于第一步,要先加上c,c从0开始,每次执行完一圈,就加1
第一个方向,从左到右,从(c,c)开始,从左到右,行i不变,列j从c一直加到n-c-1
第二个方向,从上到下,因为列j在上一步加的多了一个,需要对j进行j--,对于i也要加1,因为第i行的所有数字,在上一步都完成了。
这一步,是列j不变,行i从上一步的i加1 ,一直加到n-c-1
第三个方向,从右到左,因为行i在上一步加多了一步,需要对i进行i--。这一步,需要行i不变,列j需要j--,直到c。
第四个方向,从下到上,因为列j在上一步减多了一步,需要对j进行j++,这一步,需要列j不变,行i一直i--,直到c+1.不能到c,因为不能到达第c行,
第c行在第一个方向上已经赋值过了。
*/


#include

using namespace std;
const int NMAX= 100;
int n;
/*
思想就是:
螺旋,有四个方向,从左到右,从上到下,从右到左,从下到上。
对于第一步,要先加上c,c从0开始,每次执行完一圈,就加1
第一个方向,从左到右,从(c,c)开始,从左到右,行i不变,列j从c一直加到n-c-1
第二个方向,从上到下,因为列j在上一步加的多了一个,需要对j进行j--,对于i也要加1,因为第i行的所有数字,在上一步都完成了。
这一步,是列j不变,行i从上一步的i加1 ,一直加到n-c-1
第三个方向,从右到左,因为行i在上一步加多了一步,需要对i进行i--。这一步,需要行i不变,列j需要j--,直到c。
第四个方向,从下到上,因为列j在上一步减多了一步,需要对j进行j++,这一步,需要列j不变,行i一直i--,直到c+1.不能到c,因为不能到达第c行,
第c行在第一个方向上已经赋值过了。
*/
void getluoxuan1(int arrays[NMAX][NMAX])
{
//核心算法:
cout<<"从外到内螺旋,且数字从小到大,从矩阵的左上角开始从数字1开始螺旋:"< int c=0,i,j;
int z = n*n;
int ou=1;
while(ou<=z)
{


i=0;
j=0;
for(i+=c,j+=c;j {
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j--,i++;i {
if(ou>z) break;
arrays[i][j] = ou++;
}
for(i--,j--;j>=c;j--)//从右到左
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j++,i--;i>=c+1;i--)//从下到上
{
if(ou>z)  break;
arrays[i][j] = ou++;
}
c++;


}


}


void getluoxuan11(int arrays[NMAX][NMAX])
{
cout<<"从矩阵的左上角开始从数字的最大值开始螺旋"< int c=0,i,j;
int z = n*n;
int ou=z;
while(ou>=1)
{


i=0;
j=0;
for(i+=c,j+=c;j {
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j--,i++;i {
if(ou>z) break;
arrays[i][j] = ou--;
}
for(i--,j--;j>=c;j--)//从右到左
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j++,i--;i>=c+1;i--)//从下到上
{
if(ou>z)  break;
arrays[i][j] = ou--;
}
c++;


}


}


void getluoxuan2(int arrays[NMAX][NMAX])
{
cout<<"从矩阵的右上角开始从数字1开始螺旋:"< int c=0,i,j;
int z = n*n;
int ou=1;
while(ou<=z)
{


i=0;
j=0;
for(i=c,j=n-c-1;j>=c;j--)  //从右到左
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j++,i++;i {
if(ou>z) break;
arrays[i][j] = ou++;
}
for(i--,j++;j {
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j--,i--;i>=c+1;i--)//从下到上
{
if(ou>z)  break;
arrays[i][j] = ou++;
}
c++;


}
}


void getluoxuan22(int arrays[NMAX][NMAX])
{
cout<<"从矩阵的右上角开始从矩阵的最大值开始螺旋:"< int c=0,i,j;
int z = n*n;
int ou=z;
while(ou>=1)
{


i=0;
j=0;
for(i=c,j=n-c-1;j>=c;j--)  //从右到左
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j++,i++;i {
if(ou>z) break;
arrays[i][j] = ou--;
}
for(i--,j++;j {
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j--,i--;i>=c+1;i--)//从下到上
{
if(ou>z)  break;
arrays[i][j] = ou--;
}
c++;


}
}


void diaplay(int arrays[NMAX][NMAX])
{
int i,j;
for(i=0;i {
for(j=0;j printf("%5d",arrays[i][j]);
//cout< cout< }
}
int main()
{
int arrays[NMAX][NMAX];
cin>>n;
int i,j;
for(i=0;i for(j=0;j arrays[i][j] = 0;
cout<<"从外到内螺旋,且数字从小到大,从矩阵的左上角开始从数字1开始螺旋:"< getluoxuan1(arrays);
diaplay(arrays);

cout< cout<<"从矩阵的右上角开始从数字1开始螺旋:"< getluoxuan2(arrays);
diaplay(arrays);

cout< cout<<"从矩阵的左上角开始从数字的最大值开始螺旋"< getluoxuan11(arrays);
diaplay(arrays);


cout< cout<<"从矩阵的右上角开始从矩阵的最大值开始螺旋:"< getluoxuan22(arrays);
diaplay(arrays);


}

4阶螺旋矩阵运行结果:

螺旋矩阵(c语言实现)_第1张图片

5阶螺旋矩阵运行结果:

螺旋矩阵(c语言实现)_第2张图片

你可能感兴趣的:(螺旋矩阵(c语言实现))