PAT乙级练习题B1050. 螺旋矩阵

来源:互联网 发布:淘宝hd版怎么不了图片 编辑:程序博客网 时间:2024/05/20 19:47

题目描述

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

输入格式:

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

输出格式:

输出螺旋矩阵。每行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

题目解析

其实最好是把各个功能模块单独写成子函数,这样调试比较方便;开始写主函数的框架的时候可以把子函数先给一个正确的返回值,这样就可以先测试其他部分是否正确,最后再把这个功能子函数实现。

  1. 先用一个数组读入给出的数列,进行排序;
  2. 找出合适的m和n;
  3. 再建立一个数组,把排序好的数列按照螺旋填进去;
  4. 输出矩阵。

发现一个更好的填螺旋的方法,见@luoluo

代码

#include<iostream>#include<vector>#include<cmath>#include<algorithm>using namespace std;int main(){  int N, m, n, val;  vector<int> list;  cin >> N;  for (int i = 0; i < N; ++i)  {    cin >> val;    list.push_back(val);  }  sort(list.begin(), list.end(), [](int a, int b) {return a > b; });  m = n = sqrt(N);  while (m*n != N)  {    if (m*n < N)    {      ++m;    }    else    {      --n;    }  }  vector<int> out(N,0);  string direct = "n+";  for (int i = 0,a=0,b=0,m0=0,n0=0,m1=m,n1=n; i < N; )  {    if (direct=="n+")    {      out[a*n + b] = list[i];      ++b;      ++i;      if (b == n1)      {        direct = "m+";        ++m0;        ++a;        --b;      }      continue;    }    if (direct == "m+")    {      out[a*n + b] = list[i];      ++a;      ++i;      if (a == m1)      {        direct = "n-";        --n1;        --b;        --a;      }      continue;    }    if (direct == "n-")    {      out[a*n + b] = list[i];      --b;      ++i;      if (b == n0 - 1)      {        direct = "m-";        --m1;        --a;        ++b;      }      continue;    }    if (direct == "m-")    {      out[a*n + b] = list[i];      --a;      ++i;      if (a == m0 - 1)      {        direct = "n+";        ++n0;        ++b;        ++a;      }      continue;    }  }  for (int i = 1; i <= N; ++i)  {    cout << out[i-1];    if (i%n == 0)    {      cout << endl;    }    else    {      cout << " ";    }  }  system("pause");  return 0;}
0 0
原创粉丝点击