【算法笔记】B1050 螺旋矩阵

1050 螺旋矩阵 (25 分)
 

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;mn;且 mn 取所有可能值中的最小值。

输入格式:

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 1,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。

输入样例:

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

输出样例:

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

 

【碰壁法】判断下一个数,如果不为0就拐弯。如图:

   

  最后一个测试点总是超时,把 col = (int)sqrt(n) 改成  col = sqrt(n) 后 AC。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 10010;
 4 int a[maxn][maxn] = {0};
 5 bool cmp(int a, int b){
 6     return a > b;
 7 }
 8 int main(){
 9     int n, ori[maxn];
10     cin>>n;
11     int col = sqrt(n), row;
12     while(n % col){
13         col--;
14     }
15     row = n / col;
16     for(int i = 0; i < n; i++){
17         scanf("%d",&ori[i]);
18     }
19     sort(ori, ori + n, cmp);
20     int x = 1, y = 1, cnt = 0;
21     a[y][x] = ori[cnt];
22     while(cnt + 1 < n){
23         while(y + 1 <= col && ! a[x][y + 1])
24             a[x][++y] = ori[++cnt];
25         while(x + 1 <= row && !a[x + 1][y])
26             a[++x][y] = ori[++cnt];
27         while(y - 1 > 0 && !a[x][y - 1])
28             a[x][--y] = ori[++cnt];
29         while(x - 1 > 0 && !a[x - 1][y])
30             a[--x][y] = ori[++cnt];  
31     }
32     for(int i=1;i<=row;i++){
33         printf("%d",a[i][1]);
34         for(int j=2;j<=col;j++){
35             printf(" %d",a[i][j]);
36         } 
37         printf("\n");
38     }
39     return 0;
40 }

 

posted @ 2019-04-03 12:52  Resfeber  阅读(367)  评论(0编辑  收藏  举报