0
点赞
收藏
分享

微信扫一扫

螺旋矩阵题解

犹大之窗 2022-03-13 阅读 91

题目:题目详情 - 7-5 h0121. 螺旋矩阵 (10 分) (pintia.cn)

题解:1.本题对于数据的处理比较简单,一个sort函数就OK了,对于行列数的确定,只需要两个for循环就行了,主要说一下输出的设置。

             2.我的做法是,将要输出的一维数组的数存储在二维数组中,再二维数组打印出来。

              3.四个界限:两个行的界线,两个列的界线。

                行的界线:up(列的最小值),down(列的最大值)。

                列的界线:left(行的最小值),right(行的最大值)。

              4.关于方向:右下左上。螺旋矩阵-顺时针打印矩阵_哔哩哔哩_bilibili,方向的处理看这个视频就行了。每右下左上一次,最小值加1,最大值减1,循环到up==down或者left==right。方向处理完之后。可能还会有些数据没有处理完。再处理一下剩下的数据。

代码如下:

#include<bits/stdc++.h>
using namespace std;
bool com(int a,int b)
{
return a>b;
}
int main()
{
int x[10009],n,a=999999,m,k,l,i,j;
int c[109][109];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x[i];
}
sort(x,x+n,com);
for(i=1;i<=n;i++)
{
for(j=i;j<=n;j++)
{
if(i*j==n&&(i-j)<a)
{
m=i;
k=j;
}
}
}
l=0;
int up,down,left,right;
up=left=1;
down=m;right=k;
while(up<down&&left<right)
{
for(int i=up;i<=down;i++)//右
{
c[left][i]=x[l++];
}
for(int i=left+1;i<=right;i++)//下
{
c[i][down]=x[l++];
}
for(int i=down-1;i>=up;i--)//左
{
c[right][i]=x[l++];
}
for(int i=right-1;i>=left+1;i--)//上
{
c[i][up]=x[l++];
}
left++,up++,right--,down--;
}
if(left==right)
{
for(i=up;i<=down;i++)
c[left][i]=x[l++];
}
if(up==down)
{
for(i=left;i<=right;i++)
c[i][up]=x[l++];
}
for(i=1;i<=k;i++)
{
for(j=1;j<=m;j++)
{
cout<<c[i][j];
if(j!=m)
cout<<' ';
}
if(i!=k)
cout<<endl;
}
return 0;
}
举报

相关推荐

0 条评论