题目描述
知识点
模拟题
实现
码前思考
- 我最讨厌这种复杂的模拟题了。。。
- 我写的代码很糟糕,还是看柳神的代码比较好
代码实现
//使用vector来表述矩阵
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1e4+10;
vector<vector<int>> matrix;
int N;
int data[maxn];
bool cmp(int a,int b){
return a>b;
}
int main(){
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d",&data[i]);
}
//求最合适的m和n,需要从根号开始找
int m;
int n;
int sqr = (int) sqrt(1.0*N);
for(int i=sqr;i>=1;i--){
if(N%i == 0){
n = i;
m = N / i;
break;
}
}
//printf("%d %d",m,n);
//为数组赋值
//注意赋值方法
matrix.assign(m,vector<int>(n,0));
//接下来进行排序
sort(data,data+N,cmp);
//开始填充数组
bool isRow = true; //行方向
bool isPlus = true; //是否是加
int row = 0;
int column = 0;
//当前计算了多少个值了
for(int i=0;i<N;){ //遍历所有的元素
if(isRow){
//如果是行方向
if(isPlus){
//正的方向
int j=column;
for(;j<n&&matrix[row][j]==0;j++,i++){
matrix[row][j] = data[i];
}
//到了之后进行更新
row = row+1;
column = j-1;
isRow = false;
}else{
//负的方向
int j=column;
for(;j>=0&&matrix[row][j]==0;j--,i++){
matrix[row][j] = data[i];
}
//到了之后进行更新
row = row - 1;
column = j + 1;
isRow = false;
}
}else{
//如果是列的方向
if(isPlus){
//正的方向
int j=row;
for(;j<m&&matrix[j][column]==0;j++,i++){
matrix[j][column] = data[i];
}
//到了以后进行更新
column = column-1;
row = j-1;
isRow = true;
isPlus = false;
}else{
//负的方向
int j=row;
for(;j>=0&&matrix[j][column]==0;j--,i++){
matrix[j][column] = data[i];
}
//到了以后进行更新
column = column+1;
row = j+1;
isRow = true;
isPlus = true;
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
printf("%d",matrix[i][j]);
if(j!=n-1){
printf(" ");
}else{
printf("\n");
}
}
}
return 0;
}
码后反思
- 下面是柳神的代码和思路
柳神是按照层次去做的,非常逻辑性,这样代码写起来也更加清晰。。。#include <iostream> #include <algorithm> #include <cmath> #include <vector> using namespace std; int cmp(int a, int b) {return a > b;} int main() { int N, m, n, t = 0; scanf("%d", &N); for (n = sqrt((double)N); n >= 1; n--) { if (N % n == 0) { m = N / n; break; } } vector<int> a(N); for (int i = 0; i < N; i++) scanf("%d", &a[i]); sort(a.begin(), a.end(), cmp); vector<vector<int> > b(m, vector<int>(n)); int level = m / 2 + m % 2; for (int i = 0; i < level; i++) { for (int j = i; j <= n - 1 - i && t <= N - 1; j++) b[i][j] = a[t++]; for (int j = i + 1; j <= m - 2 - i && t <= N - 1; j++) b[j][n - 1 - i] = a[t++]; for (int j = n - i - 1; j >= i && t <= N - 1; j--) b[m - 1 - i][j] = a[t++]; for (int j = m - 2 - i; j >= i + 1 && t <= N - 1; j--) b[j][i] = a[t++]; } for (int i = 0; i < m; i++) { for (int j = 0 ; j < n; j++) { printf("%d", b[i][j]); if (j != n - 1) printf(" "); } printf("\n"); } return 0; }