PAT B1050スパイラルマトリックス(25ポイント)

ここに画像の説明を挿入
私はあまりにも賢いです、私はこの質問を書くことができません、私は本の中で境界を制御する方法に言及します。

#include <cstdio>
#include <algorithm>
using namespace std;

bool cmp(int a, int b){
    
    
	return a > b;
}

int main(){
    
    
	int N;
	scanf("%d", &N);
	
	int m, n;
	for(int i=1; i<=N; i++){
    
    
		if(N % i == 0){
    
    
			m = i;
			n = N / m;
			if(m >= n) break;
		}
	}
	int seq[N];
	for(int i=0; i<N; i++){
    
    
		scanf("%d", &seq[i]);
	}
	if(N == 1){
    
    
		printf("%d", seq[0]);
		return 0;
	} 
	sort(seq, seq+N, cmp);
	int arr[m+1][n+1];
	int i = 1, j = 1, now = 0; 
	int U = 1, D = m, L = 1, R = n;
	while(now != N){
    
    
		while(now!=N && j<R){
    
    
			arr[i][j] = seq[now++];
			j++;
		}
		while(now!=N && i<D){
    
    
			arr[i][j] = seq[now++];
			i++;
		}
		while(now!=N && j>L){
    
    
			arr[i][j] = seq[now++];
			j--;
		}
		while(now!=N && i>U){
    
    
			arr[i][j] = seq[now++];
			i--;
		}
		U++;D--;L++;R--;
		i++;j++;
		if(now == N-1){
    
    
			arr[i][j] = seq[now++];
		}
	}
	for(int i=1; i<=m; i++){
    
    
		for(int j=1; j<=n; j++){
    
    
			printf("%d", arr[i][j]);
			if(j != n) printf(" ");
		}
		printf("\n");
	}
		
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45964844/article/details/113880179