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;
}
### Java 实现螺旋矩阵 为了实现一个能够按照顺时针方向遍历并打印出矩形数组中所有元素的功能,在Java中有多种方法可以达成这一目标。下面提供了一种基于边界控制的方法来完成此操作[^1]。 #### 方法概述 该方法通过定义四个变量分别表示当前处理区域的上界、下界、左界以及右界,随着每一圈数据读取完毕后调整这些边界的数值从而缩小包围范围直至整个矩阵被完全访问过为止。 #### 示例代码 以下是具体的Java程序示例: ```java public class SpiralMatrix { public static List<Integer> spiralOrder(int[][] matrix) { List<Integer> result = new ArrayList<>(); if (matrix.length == 0 || matrix[0].length == 0){ return result; } int top = 0; // 上边界 int bottom = matrix.length - 1; // 下边界 int left = 0; // 左边界 int right = matrix[0].length - 1; // 右边界 while(true){ for(int i=left;i<=right;i++)// 向右移动直到最右边 result.add(matrix[top][i]); if(++top > bottom) break; for(int i=top;i<=bottom;i++)// 向下移动直到最底端 result.add(matrix[i][right]); if(--right < left) break; for(int i=right;i>=left;i--)// 向左移动直到最左边 result.add(matrix[bottom][i]); if (--bottom < top) break; for(int i=bottom;i>=top;i--)// 向上移动到起始位置上方一格 result.add(matrix[i][left]); if (++left > right) break; } return result; } } ``` 这段代码实现了对于任意大小(`m×n`)输入矩阵的顺时针顺序遍历,并将结果存储在一个列表当中返回给调用者[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值