首页 > 编程知识 正文

c++ 螺旋矩阵,c语言螺旋矩阵代码

时间:2023-05-06 09:32:21 阅读:190810 作者:3243

腾讯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阶螺旋矩阵运行结果:


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。