题意
将数列转成螺旋矩阵
题解
核心思想大概是走一步是否越界,越界就回退改方向,然后再走一步
有一个问题很奇怪
为什么我把if注释掉,反而会变快呢?
如果我把if注释掉,那应该是走一步,越界就回退改方向,然后再向前走一步,如果不越界,回退不改方向再向前一步,相当于无用功
大概计组没有学好 哭唧唧
源码
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int arr[100000];
int mp[1000][1000];
bool cmp(int a,int b){
return a>b;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
}
if(n==0) return 0;
sort(arr,arr+n,cmp);
int x=(int)ceil(sqrt(1.0*n)); //没有加ceil出错的原因是 x,y大小反了
while(n%x!=0){
x++;
}
int y=n/x;
int i=1,j=1;
int dir=0;
int cnt=0;
memset(mp,-1,sizeof(mp));
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
mp[i][j]=-2;
}
}
while(1){
mp[i][j]=arr[cnt++];
if(dir==0){
j++;
}else if(dir==1){
i++;
}else if(dir==2){
j--;
}else if(dir==3){
i--;
}
int predir=dir;
if(mp[i][j]==-1 || mp[i][j]!=-2&&mp[i][j]!=-1){
dir++;
dir%=4;
}
//if(predir!=dir){
if(predir==0){
j--;
}else if(predir==1){
i--;
}else if(predir==2){
j++;
}else if(predir==3){
i++;
}
if(dir==0){
j++;
}else if(dir==1){
i++;
}else if(dir==2){
j--;
}else if(dir==3){
i--;
}
//}
if(cnt==n){
break;
}
}
for(int i=1;i<=x;i++){
for(int j=1;j<y;j++){
cout<<mp[i][j]<<" ";
}
cout<<mp[i][y]<<endl;
}
return 0;
}