Pat_1050(乙级) | StriveZs的博客

Pat_1050(乙级)

1050 螺旋矩阵 (25 分)原文地址

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。

输入格式:

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10​4​​,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。

输入样例:

12
37 76 20 98 76 42 53 95 60 81 58 93

输出样例:

98 95 93
42 37 81
53 20 76
58 60 76

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include<iostream>
#include<math.h>
#include<algorithm>

using namespace std;

bool cmp(int a,int b){
return a > b;
}
int main(){
int m,n,num,t;
cin>>num;
int list1\[num\];
for(int i=0;i<num;i++){
cin>>list1\[i\];
}
sort(list1,list1+num,cmp);
/*for(int i=0;i<num;i++){
cout<<list1\[i\]<<" ";
}
cout<<endl;*/
n = floor(sqrt(num));
m = int(num / n);
while(n*m != num){
n--;
m = int(num / n);
}
if(n > m){
t = n;
n = m;
m = t;
}
int result\[m\]\[n\];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
result\[i\]\[j\] = 0;
}
}
int heng,zong,index=0,dire=0; //dire为方向 0向右移动 1向下移动 2向左移动 3向上移动
heng = 0;
zong = 0;
while(index < num){
result\[heng\]\[zong\] = list1\[index\];
//cout<<heng<<" "<<zong<<endl;
if(dire == 0){ //向右
if(zong < n-1){
if(result\[heng\]\[zong+1\] == 0){
zong++;
}
else{
dire = 1;
heng++;
}
}
else{
dire = 1;
heng++;
}
}
else if(dire == 1){
if(heng < m-1){ //向下
if(result\[heng+1\]\[zong\] == 0){
heng++;
}
else{
dire = 2;
zong--;
}
}
else{
dire = 2;
zong--;
}
}
else if(dire == 2){
if(zong > 0){ //向左
if(result\[heng\]\[zong-1\] == 0){
zong--;
}
else{
dire = 3;
heng--;
}
}
else{
dire = 3;
heng--;
}
}
else if(dire == 3){
if(heng > 0){ //向上
if(result\[heng-1\]\[zong\] == 0){
heng--;
}
else{
dire = 0;
zong++;
}
}
else{
dire = 0;
zong++;
}
}
index++;
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(j == 0){
cout<<result\[i\]\[j\];
}
else{
cout<<" "<<result\[i\]\[j\];
}
}
cout<<endl;
}
return 0;
}
StriveZs wechat
Hobby lead  creation, technology change world.
  • Post author: StriveZs
  • Post link: 1723.html
  • Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.