1105. Spiral Matrix (25)

刚开始没加判断数组是否已经排完的语句,发现有一个点过不去

原因是当从左到右只有一列时,再执行完从上到下,接着从右到左不进入循环,但是从下到上仍可能进入循环,

所以可以设置一个判断语句,当只有一列时,执行完从上到下就跳出(只有一列必然是从上到下,可以证明n为偶数刚好完成整个外围循环,此时从下到上结束,当n为奇数只能从左到右,再从上到下)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
	int p,i,j,n,m,num;
	vector<int> b;
	cin>>num;
	for(int q=0;q<num;q++){
		int temp;
		scanf("%d",&temp);
		b.push_back(temp);
	}
	sort(b.begin(),b.end());
	for(int q=1;q*q<=num;q++){
		if(num%q==0){
			m=num/q;
			n=q;
		}
	}
	if(n==1){
		for(int q=num-1;q>=0;q--){
			if(q!=num-1) printf("\n");
			printf("%d",b[q]);
		}
	}else{
	int a[m][n];
	int k=num-1;
	for(p=0;p<=(n-1)/2;p++){
		i=p;
		for(j=p;j<=n-1-p;j++){
			if(k>=0)
			a[i][j]=b[k--];
		} 
		j--;
		for(i=p+1;i<=m-1-p;i++){
			if(k>=0)
			a[i][j]=b[k--];
		}
		i--;
		for(j=n-1-p-1;j>=p;j--){
			if(k>=0)
			a[i][j]=b[k--];
		}
		j=p;
		for(i=m-1-p-1;i>=p+1;i--){
			if(k>=0)
			a[i][j]=b[k--];
		} 
	}
	for(int x=0;x<m;x++){
		for(int y=0;y<n;y++){
			if(y!=0) printf(" ");
			printf("%d",a[x][y]);
		}
		printf("\n");
	}
  } 
	return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值