目录

​1,题目描述​

​题目大意​

​2,思路​

​3,AC代码​

​4,解题过程​

​第一搏​

​第二搏​


1,题目描述

  • spiral:螺旋;

PAT_甲级_1105 Spiral Matrix (25point(s)) (C++)【螺旋矩阵】_甲级

Sample Input:

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

 

Sample Output:

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

题目大意

将N个数按照非递增的顺序放入螺旋矩阵中,且矩阵的规格m*n满足:m×n== N; m≥n; m−n的差最小;

 

2,思路

 感谢​​@漫浸天空的雨色【PAT 甲级 1105 Spiral Matrix】​​博客对测试点2,测试点4的指导!

  1. 接收数据,并排序;
  2. 当N==1时特判(否则测试点4会超时!不知道为什么,不是出错而是超时。。。):
  3. PAT_甲级_1105 Spiral Matrix (25point(s)) (C++)【螺旋矩阵】_1105_02

  4. 设置四个边界:up,down,right,left。将数据按照从左向右,从上向下,从右向左,从下向上的顺序填充,注意边界:
  5. PAT_甲级_1105 Spiral Matrix (25point(s)) (C++)【螺旋矩阵】_1105_03

  6. index == 0时需要特判,否则超时。(嘤嘤嘤)
  7. PAT_甲级_1105 Spiral Matrix (25point(s)) (C++)【螺旋矩阵】_1105_04

 

3,AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
int m, n, N;
scanf("%d", &N);
for(int i = sqrt(N); i > 0; i--)
if(N % i == 0){
n = i;m = N / i;
break;
}
int data[N], matrix[m][n];
for(int i = 0; i < N; i++)
scanf("%d", &data[i]);
if(N == 1){ //N=1时需要特判 2020/3/15测试时 不加此条件测试点4超时
printf("%d", data[0]);
return 0;
}
sort(data, data + N);
int index = N - 1, i = 0, j = 0; //index指向data中将放到matrix中的元素 i和j指向matrix中的位置
int up = 0, down = m - 1, left = 0, right = n - 1;//四个边界
while(index >= 0){
while(j < right && index >= 0){
matrix[i][j++] = data[index--];
}
while(i < down && index >= 0){
matrix[i++][j] = data[index--];
}
while(j > left && index >= 0){
matrix[i][j--] = data[index--];
}
while(i > up && index >= 0){
matrix[i--][j] = data[index--];
}
up++;right--;down--;left++;
i++;j++;
if(index == 0){ //index=0时(最后一个数)需要特判 2020/3/15测试时 不加此条件测试点2超时
matrix[i][j] = data[index];
break;
}
}
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
printf("%d%c", matrix[i][j], j == n-1 ? '\n':' ');
}
}
return 0;
}

4,解题过程

第一搏

接受数据,排序,按照螺旋顺序填坑,,,安排的明明白白!

#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
int m, n, N;
scanf("%d", &N);
for(int i = 1; i <= sqrt(N); i++)
if(N % i == 0){
n = i;m = N / i;
}
int data[N], matrix[m][n];
for(int i = 0; i < N; i++)
scanf("%d", &data[i]);
sort(data, data + N);
int index = N - 1, i = 0, j = 0;//index指向data中将放到matrix中的元素 i和j指向matrix中的位置
int up = 0, down = m - 1, left = 0, right = n - 1;//四个边界
while(index >= 0){
while(j < right && index >= 0){
matrix[i][j++] = data[index--];
}
while(i < down && index >= 0){
matrix[i++][j] = data[index--];
}
while(j > left && index >= 0){
matrix[i][j--] = data[index--];
}
while(i > up && index >= 0){
matrix[i--][j] = data[index--];
}
up++;
right--;
down--;
left++;
i++;j++;
}
for(i = 0; i < m; i++){
printf("%d", matrix[i][0]);
for(j = 1; j < n; j++){
printf(" %d", matrix[i][j]);
}
printf("\n");
}
return 0;
}

PAT_甲级_1105 Spiral Matrix (25point(s)) (C++)【螺旋矩阵】_甲级_05

PAT_甲级_1105 Spiral Matrix (25point(s)) (C++)【螺旋矩阵】_C++_06

超时!!!???

 

第二搏

翻遍CSDN,终于找到​​@漫浸天空的雨色【PAT 甲级 1105 Spiral Matrix】​

1,对N==1时进行特判。测试点4AC!

PAT_甲级_1105 Spiral Matrix (25point(s)) (C++)【螺旋矩阵】_1105_07

PAT_甲级_1105 Spiral Matrix (25point(s)) (C++)【螺旋矩阵】_甲级_08

2,当index为0(即到了最后一个数时),直接处理,不再循环。测试点2AC!

PAT_甲级_1105 Spiral Matrix (25point(s)) (C++)【螺旋矩阵】_螺旋矩阵_09