PAT_甲级_1105 Spiral Matrix (25point(s)) (C++)【螺旋矩阵】
原创
©著作权归作者所有:来自51CTO博客作者再见萤火虫IT的原创作品,请联系作者获取转载授权,否则将追究法律责任
目录
1,题目描述
题目大意
2,思路
3,AC代码
4,解题过程
第一搏
第二搏
1,题目描述
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的指导!
- 接收数据,并排序;
- 当N==1时特判(否则测试点4会超时!不知道为什么,不是出错而是超时。。。):
- 设置四个边界:up,down,right,left。将数据按照从左向右,从上向下,从右向左,从下向上的顺序填充,注意边界:
- index == 0时需要特判,否则超时。(嘤嘤嘤)
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;
}
超时!!!???
第二搏
翻遍CSDN,终于找到@漫浸天空的雨色【PAT 甲级 1105 Spiral Matrix】
1,对N==1时进行特判。测试点4AC!
2,当index为0(即到了最后一个数时),直接处理,不再循环。测试点2AC!: