腾讯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<iostream>

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开始螺旋:”<<endl;
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<n-c;j++)  //从左到右
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j–,i++;i<n-c;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<<“从矩阵的左上角开始从数字的最大值开始螺旋”<<endl;
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<n-c;j++)  //从左到右
{
if(ou>z) break;
arrays[i][j] = ou–;
}
for(j–,i++;i<n-c;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开始螺旋:”<<endl;
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<n-c;i++) // 从上到下
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(i–,j++;j<n-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 getluoxuan22(int arrays[NMAX][NMAX])
{
cout<<“从矩阵的右上角开始从矩阵的最大值开始螺旋:”<<endl;
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<n-c;i++) // 从上到下
{
if(ou>z) break;
arrays[i][j] = ou–;
}
for(i–,j++;j<n-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 diaplay(int arrays[NMAX][NMAX])
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf(“%5d”,arrays[i][j]);
//cout<<arrays[i][j]<<” “;
cout<<endl;
}
}
int main()
{
int arrays[NMAX][NMAX];
cin>>n;
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
arrays[i][j] = 0;
cout<<“从外到内螺旋,且数字从小到大,从矩阵的左上角开始从数字1开始螺旋:”<<endl;
getluoxuan1(arrays);
diaplay(arrays);

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

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

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

}

4阶螺旋矩阵运行结果:

5阶螺旋矩阵运行结果: