算法-数组:螺旋数字排列

内螺旋算法问题 记录一下,在一次笔试环节中的内螺旋算法问题。 把数字按照下图规律去排列,设 1 的坐标是(0, 0), x 方向向右为正,y 方向 向下为正。例如: 2 的坐标是(1,0), 3 的坐标是(1,1), 7 的坐标为 (-1, -1)。 请实现函数: 输入是任意坐标(x,y), 输出所对应的数字。 思路一: 初始化二维数组,初始元素值是0; 从中间选择一个元素作为起点1,将选中的元素依次向右移动,向下移动,向左移动,向上移动; 每移动到一个新元素上,就把计数器的值赋给它; 如果元素无法进行第2 阅读详情

/****************************************
 * http://community.youkuaiyun.com/Expert/topic/3848/3848013.xml?temp=8.248538E-02
 *   左移:left(x+,y);
 *   右移:right(x-,y);
 *   上移:up(x,y-);
 *   下移:down(x,y+)
 *   --------------------------
 *       0 1 ...     N(x)
 *       0* * * * * * *                        右 右 右 右 。 。 。 右 下
 *       1* * * * * * *                        右                        下
 *       .* * * * * * *                        上                        下
 *       .* * * * * * *                          。。。。。。。。。。。
 *        * * * * * * *                        上                        下
 *        * * * * * * *                        上                        下
 *    (y)M* * * * * * *                        上 左 左 左 。 。 。 左 左
 *   --------------------------
 *   注意坐标:(x,y) 和数组[y],[x];是反过来的,呵呵。我刚才搞错了.
 *            比如右下角的 坐标是(N,M); 数组是[M][N]
 ***************************************/
import java.lang.String;

class Point {
    private int x = 0;
    private int y = 0;
    Point(int pX, int pY) {
        setPoint(pX, pY);
    }
    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
    public void setPoint(int pX, int pY) {
        x = pX;
        y = pY;
    }
    public Point moveBy(int mX, int mY) {
        setPoint( (x + mX),(y + mY) );
        return this;
    }
    public Point moveBy(Point moveValue) {
        //return new Point( (this.getX()+moveValue.getX()), (this.getY()+moveValue.getY()) );
        this.setPoint( (this.getX()+moveValue.getX()), (this.getY()+moveValue.getY()) );
        return this;
    }
}

class Method extends Point {
    private static int x = 0;
    private static int y = 0;
    private final int N;//x.limit;
    private final int M;//y.limit;
    private static final Point moveLeft   = new Point(-1, 0);
    private static final Point moveRight  = new Point( 1, 0);
    private static final Point moveUp     = new Point( 0,-1);
    private static final Point moveDown   = new Point( 0, 1);

    Method(int pX, int pY) {
        super(0,0);
        setPoint(0,0);
        N = pX;
        M = pY;
    }
    public Point nextPoint(Point currentPoint) {
        int nIndex=-1,        //当前元素所在圈(从外到内),也是下面四值的最小值+1
            gapXs=0,        //与所在圈起点x的差值
            gapXe=0,        //与所在圈终点x的差值
            gapYs=0,        //与所在圈起点y的差值
            gapYe=0;        //与所在圈终点y的差值
        boolean bLeft        = false,
                bRight        = false,
                bTop        = false,
                bBottom        = false;
        Point moveWhere = new Point(0,0);

        gapXs = currentPoint.getX() - 0;
        gapXe = N - currentPoint.getX();
        gapYs = currentPoint.getY() - 0;
        gapYe = M - currentPoint.getY();

        do {
            bLeft   = gapXs>(nIndex+1)?false:true;
            bRight  = gapXe>(nIndex+1)?false:true;
            bTop    = gapYs>(nIndex+1)?false:true;
            bBottom = gapYe>(nIndex+1)?false:true;
            nIndex++;//从-1开始做++
        }while( !(bLeft||bRight||bTop||bBottom) );

        //顺时针螺旋,判断先后为:bTop -> bRight -> bBottom -> bLeft;
        //逆时针螺旋,判断先后为:bTop <- bRight <- bBottom <- bLeft;
        if( bTop ) {                                //上面
            if( bRight )                                //右上角,下移
                moveWhere = moveDown;
            else                                        //上边,右移
                moveWhere = moveRight;
        }
        else if( bRight ) {                        //右面
            if( bBottom )                                //右下角,左移
                moveWhere = moveLeft;
            else
                moveWhere = moveDown;                        //右边,下移
        }
        else if( bBottom ) {                        //下面
            if( bLeft )                                        //左下角:特殊
                if( (currentPoint.getY()-nIndex)==1 )                //本圈轮回结束,重新右移
                    moveWhere = moveRight;
                else                                                //左下角,上移动
                    moveWhere = moveUp;
            else
                moveWhere = moveLeft;                        //下边,左移
        }
        else {                                        //左面
            if( (currentPoint.getY()-nIndex)>=2 )        //左边,上移
                moveWhere = moveUp;
            else                                        //差值为1时,表本圈轮回结束
                moveWhere = moveRight;
        }
        return currentPoint.moveBy(moveWhere);        //返回currentPoint自身(已经重置),
    }
}

public class Arr {

    public static void main(String [] args) {

        final int DEF_ARR_N = 7;
        final int DEF_ARR_M = 7;
        int arrX = 0;
        int arrY = 0;

        int nNumArgs = args.length;
        if( nNumArgs >=2 ) {
            arrX = Integer.parseInt(args[0]);
            arrY = Integer.parseInt(args[1]);
        }
        else {
            arrX = DEF_ARR_N;
            arrY = DEF_ARR_M;
        }

        int nVal    = 0;
        int [][] aa = new int[arrY][arrX];
        Point  test = new Point(0,0);
        Method meth = new Method(arrX-1,arrY-1);

        System.out.println("start-------------------------------------------");
        for(int i=1; i<=arrX*arrY; i++) {
        //  System.out.println("aa["+(test.getY())+"]["+(test.getX())+"]="+i);
            aa[test.getY()][test.getX()] = i;
            test = meth.nextPoint(test);
        }

        String printStr;
        for(int i=0; i<arrY; i++) {
            System.out.print("        ");
            for(int j=0; j<arrX; j++) {
                printStr = ("       "+aa[i][j]);
                System.out.print(   printStr.substring( (printStr.length()-7), printStr.length() )   );
            }
            System.out.println("");
        }
    }
}

D:/MyJava>java  Arr 5 6
start-------------------------------------------
       1        2       3      4       5
      18     19     20     21      6
      17     28     29     22      7
      16     27     30     23      8
      15     26     25     24      9
      14     13     12     11     10
D:/MyJava>


我的站点:www.fbug.cn


用二维数组打印螺旋方阵和螺旋矩阵 ———————————————————————————————————————————————————————————————— 螺旋方阵,形如: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 ... 阅读详情

相关推荐

螺旋矩阵的生成与实现:探索二维数组的螺旋顺序

在计算机科学中,螺旋矩阵是一种特殊的矩阵排列方式,其元素按螺旋状从中心向外扩展填充。对于一个 m x n 的二维矩阵,我们可以按照顺时针或逆时针方向填充元素,形成从中心向外围递增的数值模式。螺旋矩阵在某些算法设计和数据结构中有着独特的应用,比如在图的遍历和模拟等场景下。螺旋矩阵的一个显著特性是,任意给定行或列的数字序列,都呈现出连续递增或递减的规律。这种特性为算法设计带来了便利,因为它允许我们基于已知的索引快速确定对应位置的值。

weixin_42527589的博客 1439

MxN螺旋矩阵(由内向外)

问题描述按顺时针方向构建一个m * n的螺旋矩阵(或按顺时针方向螺旋访问一个m * n的矩阵):在不构造螺旋矩阵的情况下,给定坐标i、j值求其对应的值f(i, j)。如对6 * 6矩阵, f(2, 0) =19  f(2, 1) = 6。 编程实现输出这个矩阵问题,我是采用模拟进行构造的,可以看到从1开始的方向变化始终是 right->down->

松子茶的专栏 7881

很经典的Java编写的螺旋数算法

很经典的Java编写的螺旋数算法,不经典你喷我……很简单、很容易理解。适合初级程序员……

螺旋式排列数组

螺旋式排列数组

Ambitious3376的博客 1696

AI大模型实战——模型测评:如何评估大模型的表现

大模型评测体系解析:从数据集到基准测试 本文系统梳理了大模型评测的关键要素。在数据集方面,重点介绍了C-Eval等中文评估套件,强调数据质量需通过人工验证保证。评测维度涵盖自然语言理解、知识推理、代码生成等核心能力。基准测试作为标准化评估方法,Glue、SuperClue等平台提供了公平比较的依据。文章指出厂商自评榜单存在水分问题,建议关注第三方评测。同时解析了少样本和零样本两种prompt模式的应用场景差异。最后解释了"SOTA"这一术语在描述模型最优性能时的应用价值。整体呈现了大模型

小志的博客 895

飞行器坐标转换

本文定义的是右手直角坐标系,x−y−zx-y-zx−y−z轴分别为北-天-东。从AAA坐标系到BBB坐标系是分别绕y−z−xy-z-xy−z−x轴,即天-东-北旋转ψ−θ−γψ−θ−γ。如果AAA是惯性系,BBB是机体系,则这三个角度分别为偏航角、俯仰角、横滚角。图1 惯性系到机体系。

gongfuyd的博客 1355

Leetcode33.搜索旋转排序数组

搜索排序旋转数组 1. 问题描述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。 给你 旋转后

菜到不敢run 167

NVIDIA 2025 Board Design Engineer 校招笔试

电路分析,矩形波阶跃反馈驱动​,误差信号。非常简单,数电or​离散基础。第一题是考试规矩知情确认。大二暑假做的,纯体验​。五六题太长,下篇分享。

m0_74253823的博客 1129

螺旋数组排序

问题描述: 有一个二维数组,将它每个元素按照螺旋方式排序 比如原始数组如下 排序后的结果为: 代码 #include “stdlib.h” #include “stdio.h” //#define M 21 //#define N 17 void print(int ** arr, int x_size, int y_size) { int i = 0, j = 0; for(i = 0; i < x_size; i++){ for(j = 0; j < y_size; j++){ prin

date_0413的博客 431

第4章 Stata参数检验

目录 4.1单一样本T检验 案例延伸 4.2独立样本T检验 案例延伸 1.改变置信水平 2.在异方差假定条件下进行假设检验 4.3配对样本T检验 案例延伸 1.改变置信水平 4.4单一样本方差的假设检验 案例延伸 4.5双样本方差的假设检验 参数检验(Parameter Test)是指对参数的平均值、方差、比率等特征进行的统计检验。参数检验一般假设统计总体的具体分布为已知,但是其中一些参数或者取值范围不确定,分析的主要目的是估计这些未知参数的取值,或者对这些参数进...

qq_45112156的博客 1万+

2025年华为杯中国研究生数学建模竞赛E题 高速列车轴承智能故障诊断问题 思路+代码

all_data, file_info = preprocessor.load_mat_files(file_list[:50]) # 加载前50个文件作为示例。[y_source, y_source, domain_labels], # 注意:这里使用伪标签。X_target = np.random.randn(100, X_source.shape[1], 1) # 示例数据。"""构建CNN-Transformer混合模型""""""构建Transformer模型"""

YOLO 1046

关于数组螺旋排列的问题探讨

今天同学给了个题目,做个数组螺旋排列,我是个新手,就想看看,努力了下,做了2个不同的算法,自我感觉第二个比较好,大家给点意见 .算法一:class Quear{ static int inputNumber=6; static int lastValue=0; static int[][] quear=new int[inputNumber][inputNumber];   static

cqu903的专栏 639

FortiWeb 相对路径遍历漏洞复现(CVE-2025-64446)

FortiWeb是Fortinet公司推出的企业级Web应用防火墙(WAF),专为保护Web应用和API抵御高级威胁设计。它集成人工智能与机器学习技术,通过双层检测引擎(HMM模型与SVM向量机)精准识别异常流量,可防御OWASP Top 10攻击、SQL 注入、XSS、DDoS及恶意机器人。其核心功能包括API自动化保护、虚拟补丁集成(兼容Acunetix等第三方扫描工具)及智能流量分析,支持HTTP/2、WebSocket等现代协议。(CVE-2025-64446)

iSee857的博客 467

代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

所有元素,且元素按顺时针顺序螺旋排列的。如果不存在符合条件的子数组,返回。找出该数组中满足其总和大于等于。个正整数的数组和一个正整数。组成的新数组,要求也按。最后,返回填充好的二维数组。

weixin_74815669的博客 1881

使用CloudCompare和CANUPO进行点云分类的编程指南

在本文中,我们将介绍如何使用CloudCompare和CANUPO库进行点云分类的编程。CloudCompare是一款功能强大的开源点云处理软件,而CANUPO是一个用于点云分类和分割的C++库。这只是一个简单的点云分类示例,CANUPO库还提供了其他更高级的功能和算法,以满足各种点云分类需求。该函数接受点云数据、地面点掩码和非地面点掩码作为输入,并将分类结果存储在这两个掩码向量中。完成安装后,我们可以开始编写点云分类的代码。最后,我们遍历点云数据,并根据地面点和非地面点的掩码将结果打印出来。

ByteWhisper的博客 1058

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

day4_螺旋矩阵、区间和

今天是leetcode和代码随想录上的题。刷题计划也是按照代码随想录进行学习。

qq_62041987的博客 283

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

qq_33440497的博客 705

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

螺旋矩阵 题解

螺旋矩阵   【问题描述】 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动; 如果前方是未曾经过的格子, 则继续前进,否则右转; 重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1, 2, 3, ... , n2,便构成了一个螺旋矩阵。 下图是一个n = 4 时的螺旋矩阵。  现给出矩阵大小n以及i和j,

su1495120的博客 4592

螺旋数组的算法

螺旋数组即为从外圈至内圈排列的一组数据 [[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.] [ 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 15.] [ 51. 96. 97. 98. 99. 100. 101....

weixin_45903952的博客 902

算法学习———Java实现螺旋数组

让我们先来认识一下什么是螺旋数组。 形如和这种 按顺序输入的二维数组,会以顺时针螺旋排列 输出。 我们现在希望输入一个整数 n ,建立一个 n x n 的螺旋数组并输出。 例如 我们输入3 输出 OK,让我们开始分析一下。 每一次放入数组的顺序数字很好实现,每次加一即可。 难点在于放入数组的数字需要拐弯,这样放入的顺序问题。 对于这样的问题,我们可以定义一个变量,让他表示放入数字的方向, 观察可得到我们每个螺旋数组都是先向右创建,再向下创建 在这里我们使用 0代表向下 , 1代...

jack_shuai的博客 1427

JAVA:实现螺旋数组算法(附带源码)

JAVA:实现螺旋数组算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1017

n阶螺旋数字方阵-c语言

第一次写博客,有不足的地方还希望各位多多指教。 n阶螺旋数字方阵,结果是这样的,这里说的是顺时针的,逆时针的原理类似。 代码如下 1 #include <stdio.h> 2 void main() 3 {//n阶螺旋数字方阵,先把数字螺旋输入到数组中, 4 //然后把数组中的数字按顺序输出 5 int n,h,l,i,x=1;...

anjinbao3502的博客 2767

螺旋矩阵 II:顺时针填充数字的巧妙实现

本文介绍了如何生成n×n的螺旋矩阵,其中数字按顺时针顺序从1到n²填充。通过定义四个边界指针(左、右、上、下),按照右→下→左→上的顺序循环填充,每次填充后调整对应边界。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 9403

一个解决数字螺旋排列的程序

题目: 编程输出以下格式的数据:   When i=0    1   When i=1      7   8   9   6   1   2   5   4   3   When i=2        21  22  23  24  25     20   7    8     9   10     19   6    1     2   11     1

1259

螺旋矩阵的算法刷题

螺旋矩阵的算法刷题

everything is possible,anything is OK. 1242
上一篇: 算法-数组:找出符合某条件的最大矩形区域
下一篇: 网页之间窗口切换方法一
FBugFramework
博客等级 码龄23年 25粉丝 36原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值