PAT 1105 Spiral Matrix

This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasing order. A spiral matrix is filled in from the first element at the upper-left corner, then move in a clockwise spiral. The matrix has m rows and n columns, where m and n satisfy the following: m×n must be equal to N; m≥n; and m−n is the minimum of all the possible values.

Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N. Then the next line contains N positive integers to be filled into the spiral matrix. All the numbers are no more than 10^​4. The numbers in a line are separated by spaces.

Output Specification:
For each test case, output the resulting matrix in m lines, each contains n numbers. There must be exactly 1 space between two adjacent numbers, and no extra space at the end of each line.

Sample Input:

12
37 76 20 98 76 42 53 95 60 81 58 93

Sample Output:

98 95 93
42 37 81
53 20 76
58 60 76

#include<iostream>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
bool cmp(const int& a, const int& b){
  return a>b;
}
int main(){
  int N, k;
  cin>>N;
  for(k=sqrt((double)N); k>=1; k--)
    if(N%k==0)
      break;
  int row=N/k, col=k;
  int n=row/2;
  vector<int> vi(N,0);
  for(int i=0; i<N; i++)
    cin>>vi[i];
  sort(vi.begin(), vi.end(), cmp);
  vector<vector<int>> graph(row,vector<int>(col,0));
	int cnt=0;
	for(int i=0; i<=n; i++){
		for(int j=i; j<col-i&&cnt<N; j++)
	    	graph[i][j]=vi[cnt++];
	    for(int j=i+1; j<row-i&&cnt<N; j++)
	        graph[j][col-i-1]=vi[cnt++];
	    for(int j=col-i-2; j>=i&&cnt<N; j--)
	    	graph[row-i-1][j]=vi[cnt++];
	    for(int j=row-2-i; j>=i+1&&cnt<N; j--)
	        graph[j][i]=vi[cnt++];
	}
	for(int i=0; i<row; i++){
		for(int j=0; j<col; j++)
		    j==0?cout<<graph[i][j]:cout<<" "<<graph[i][j];
		cout<<endl;
	}
	return 0;
}
posted @ 2018-08-19 17:26  A-Little-Nut  阅读(105)  评论(0编辑  收藏  举报