题目链接:1050 螺旋矩阵
结果
思路
中规中矩地输入数据,用数组保存,sort排序。从根号N开始寻找m,n值。这题的主要部分:螺旋填充。我用的办法是记录边界,已经填充完毕的边进行缩进,在剩余部分里继续填充。填充位移动策略优先度依次为: -靠左边且不靠上边与右边则向上移动 -靠下边且不靠左边则向左移动 -靠右边且不靠下边则向下移动 -靠上边且不靠右边则向右移动边界缩进策略: 首次进入以上4中移动策略时,将上一策略经过的位置排除出边界。中规中矩地输出数据。
代码写得十分丑陋,大佬轻喷。
代码
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std
;
int main(){
int N
,m
,n
;
cin
>> N
;
int a
[N
];
for(int i
=0;i
<N
;i
++) cin
>> a
[i
];
for(m
=sqrt(0.0+N
); N
% m
|| m
< N
/m
; m
++);
sort(a
,a
+N
);
n
= N
/ m
;
int b
[m
][n
];
int left
=0,right
=n
-1,up
=0,down
=m
-1,x
=0,y
=0,flag
=0;
for(int i
=N
-1;i
>=0;i
--){
b
[x
][y
] = a
[i
];
if(y
== left
&& x
!= up
&& y
!= right
){
if(flag
!=1){
flag
= 1;
down
--;
}
x
--;
}
else if(x
== down
&& y
!= left
){
if(flag
!=2){
flag
= 2;
right
--;
}
y
--;
}
else if(y
== right
&& x
!= down
){
if(flag
!=3){
flag
= 3;
up
++;
}
x
++;
}
else if(x
== up
&& y
!= right
){
if(flag
!=0){
flag
= 0;
left
++;
}
y
++;
}
}
for(int i
=0;i
<m
;i
++){
for(int j
=0;j
<n
;j
++){
cout
<< b
[i
][j
];
if(j
!=n
-1) cout
<< ' ';
else if(i
!=m
-1) cout
<< endl
;
}
}
return 0;
}
转载请注明原文地址:https://blackberry.8miu.com/read-17859.html