1050. 螺旋矩阵(25).

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;


int N;


bool compare(const int &a, const int &b)
{
    return a > b;
}


void solve()
{
    int A[N];
    for(int i = 0; i < N; i ++){
        cin >> A[i];
    }
    sort(A, A + N, compare);


    //以sqrt(n)向下寻找最大的n 
    int m, n = sqrt(N);
    while(N % n != 0){
        n --;
    }
    m = N / n;


    int T[m][n];
    bool vis[m][n]; //vis[i][j] = true表示(i,j)已经访问过 


    int dx[] = {0, 1, 0, -1};
//      T【x】【y】
//x轴(行)  水平方向移动 坐标对应的操作   0  +1   0   -1




int dy[] = {1, 0, -1, 0}, di = 0;
//y轴 (列) 垂直方向移动 坐标对应的操作 +1    0   -1   0 






    for(int i = 0; i < m; i ++)
        for(int j = 0; j < n; j ++){
            vis[i][j] = false;
        }








    int i = 0, j = 0, k = 0;
    do{
        T[i][j] = A[k ++];
        vis[i][j] = true;


        int ni = i + dx[di], nj = j + dy[di];
//( ni , nj )下次的坐标
        if(ni < 0 || ni >= m || nj < 0 || nj >= n || vis[ni][nj])
//
//下次运行会碰壁 或者是已经访问过的      就进行下一个方向di(0-3)对应 dx【】  dy【】  的下标
{
            di = (di + 1) % 4;
        }








        i += dx[di];
        j += dy[di];
    }while(k < N);/        N个数据已经填充完


    for(int i = 0; i < m; i ++){
        for(int j = 0; j < n; j ++){
            cout << T[i][j];
            if(j + 1 < n)
                cout << " ";
        }
        cout << endl;
    }


}


int main()
{
    cin >> N;
    solve();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值