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 93Sample 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 ; }