solution Of 1105. Spiral Matrix (25)

48 篇文章 0 订阅

1105. Spiral Matrix (25)
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 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


结题思路:
题意要求我们将蛇形输出数据。
要求1:数据从大到小排序;
要求2:计算矩阵高宽,高大于宽,高减宽尽可能小;
要求3:将数据蛇形填入矩阵。
(考虑特例:矩阵1mul1,矩阵Nmul1)

程序步骤:
第一步、数据排序;
第二步、计算行列长度。
第三步、迭代层数,数据填入矩阵后,输出。

具体程序(AC)如下:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> value;//存储原始数据
vector<vector<int> >metrix;//二维矩阵
int rowLength,colLength;
int num;
int cmp(const int& a,const int& b)
{
    return a>b;
}
int circle(int x,int y,int rows,int cols,int no)
{//每次处理最外围的一圈
    int i;
    for(i=y;i<y+cols;++i)//第上方的行
        metrix[x][i]=value[no++];
    for(i=x+1;i<x+rows;++i)//最右方的列
        metrix[i][y+cols-1]=value[no++];
    if(no>=num)//这里需要判断,数据在这里就可能已经填充完了,继续进行计算可能产生数据覆盖
        return no;
    for(i=y+cols-2;i>=y;--i)//最下方的行
        metrix[x+rows-1][i]=value[no++];
    for(i=x+rows-2;i>x;--i)//最左方的列
        metrix[i][y]=value[no++];
    return no;
}
int main()
{
    cin>>num;
    if(num==0)
        return 0;
    value.resize(num);
    for(int i=0;i<num;++i)
        cin>>value[i];
    if(num>1)
        sort(value.begin(),value.end(),cmp);
    int cols=0,rows;
    for(int i=2;i*i<=num;++i)//得到列数
        if(num%i==0)
            cols=i;
    if(cols!=0)
        rows=num/cols;
    else
    {
        rows=num;
        cols=1;
    }//作出判断,可能出现上面说的特例
    vector<int> tmp;//二维数组
    tmp.resize(cols);
    for(int i=0;i<rows;++i)
        metrix.push_back(tmp);
    int startX=0,startY=0;
    rowLength=rows;
    colLength=cols;
    int visited=0;//下次填充的数据的索引值
    //初始化结束
    while(visited<num)//剥洋葱的形式进行数据填充
    {
        visited=circle(startX,startY,rowLength,colLength,visited);//剥掉一层
        ++startY;//起始点更新
        ++startX;
        rowLength-=2;//行列长度更新
        colLength-=2;
    }
    for(int i=0;i<rows;++i)//输出
        {
        cout<<metrix[i][0];
        for(int j=1;j<cols;++j)
            cout<<" "<<metrix[i][j];
        cout<<endl;
        }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值