PAT A1105 Spiral Matrix
- 转圈圈太可怕,想不出来怎么搞,参考了一下,选择了自己比较容易理解的方案
- 设置上下左右四个边界值(都是可到达的下标),每次填一圈四条边,然后修改边界值和i j,注意剩下一个数的情况要特殊处理
- 求m n的时候,如果是先找大的,开根号后需要向上取整,否则可能求出了小的那个
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
vector<int> vi;
int main(){
int num;
cin >> num;
for(int i = 0;i < num;i ++){
int tmp;
scanf("%d",&tmp);
vi.push_back(tmp);
}
if(num == 1){
printf("%d",vi[0]);
return 0;
}
sort(vi.begin(),vi.end());
int n = sqrt((double)num);
while(num % n) n --;
int m = num / n;
vector<vector<int> > vv(m,vector<int>(n));
int cnt = num - 1,i = 0,j = 0;
int up = 0,down = m - 1,left = 0,right = n - 1;
while(cnt >= 0){
while(cnt >= 0 && j < right){
vv[i][j] = vi[cnt --];
j ++;
}
while(cnt >= 0 && i < down){
vv[i][j] = vi[cnt --];
i ++;
}
while(cnt >= 0 && j > left){
vv[i][j] = vi[cnt --];
j --;
}
while(cnt >= 0 && i > up){
vv[i][j] = vi[cnt --];
i --;
}
up ++;down --;left ++;right --;
i ++;j ++;
if(cnt == 0) vv[i][j] = vi[cnt --];
}
for(int i = 0;i < m;i ++){
for(int j = 0;j < n;j ++){
printf("%d",vv[i][j]);
if(j != n - 1) printf(" ");
else printf("\n");
}
}
return 0;
}