1105. Spiral Matrix (25)

1105. Spiral Matrix (25)

时间限制
150 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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 ncolumns, 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 104. 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

提交代码

http://www.patest.cn/contests/pat-a-practise/1105

思路和问题:

这题应该算是模拟题 ,就是按照螺旋方式一步步的赋值,不过原先忘了 在每一圈的每一步都加上break判断语句 导致有错误,圈数显然应该是小于行数m的


ac代码:

#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>

using namespace std ;

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

int main()
{
	//freopen("in.txt" , "r" , stdin) ;
	int nn , i , j ;
	vector<int> v ;
	scanf("%d" , &nn) ;
	v.resize(nn+1) ;
	for(i = 0 ; i < nn ; i++)
	{
		scanf("%d" , &v[i]) ;
	}
	if(nn == 0){  
        printf("0\n");  
        return 0;  
    } 
	sort(v.begin() , v.end(), cmp) ;
	
	int m, n;  
    int minDiff = 9999999;  
    for(i=1; i<=nn; i++){  
        for(j=i; j<=nn; j++){  
            if(i*j>nn){  
                break;  
            }  
            if(i*j==nn && (j-i)<minDiff){  
                m=j;   
                n=i;  
                minDiff=(j-i);  
            }  
        }  
    } 

	if(n == 1 || m == nn)
	{
		for(i = 0 ; i < nn ; i++)
		{
			printf("%d\n" , v[i]) ;
		}
		return 0 ;
	}
	int index = 0 , k;

	vector<vector<int>> b;  
    b.resize(m+1, vector<int>(n+1,0)); 
	// 一圈一圈的赋值 , break都需要
	for(k = 0 ; k < m ; k++)
	{
		// 从左到右
		for(i = k ; i <= n - k - 1 ; i ++)
		{
			b[k][i] = v[index++] ;
			if(index >= nn)
				break;
		}
		if(index >= nn)
				break;
		// 从上到下
		for(i = k+1 ; i <= m - k - 1 ; i ++)
		{
			b[i][n-k-1] = v[index++] ;
			if(index >= nn)
				break;
		}
		if(index >= nn)
				break;
		// 从右到左
		for(i = n-k-2 ; i >= k; i --)
		{
			b[m-k-1][i] = v[index++] ;
			if(index >= nn)
				break;
		}
		if(index >= nn)
				break;
		//从下到上
		for(i = m-k-2 ; i >= k + 1; i --)
		{
			b[i][k] = v[index++] ;
			if(index >= nn)
				break;
		}
		if(index >= nn)
			break ;
	}
	for(i = 0 ;i < m ; i++)
	{
		printf("%d" , b[i][0]) ;
		for(j = 1 ; j < n ; j ++)
		{
			printf(" %d" , b[i][j]) ;
		}
		printf("\n") ;
	}
	return 0 ;	
}



你可能感兴趣的:(1105. Spiral Matrix (25))