Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 638|回复: 0

[算法学习]解螺旋矩阵

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-7 00:03:48 | 显示全部楼层 |阅读模式
    所谓的螺旋矩阵,指如下形式的H列*L行的矩阵:
         如何编程产生呢,ChinaJavaWorld技术论坛上曾经有不少爱好者给出过自己的解答,这里选两个易理解算法的程序学习。 一、方法一 沿如图方向,沿各个矩形边框依次给矩阵的每一个元素赋值,在计算机内存中构造一个完整的螺旋矩阵,然后输出。   代码:
    1. public class Test {
    2. public static int[][] makeMatrix(int w, int h) {
    3.    int[][] mtr = new int[w][h];
    4.    int d = 1, x = 0, y = 0;
    5.    while(true) {
    6.      mtr[x][y] = d++;
    7.      //各方向可否前进
    8.      boolean right = x< w-1&&mtr[x+1][y]==0;
    9.      boolean down = y< h-1&&mtr[x][y+1]==0;
    10.      boolean left = x>0&&mtr[x-1][y]==0;
    11.      boolean up = y>0&&mtr[x][y-1]==0;
    12.      //判断前进方向
    13.      if(right) if(up) y--; else x++;
    14.      else if(down) if(right) x++; else y++;
    15.      else if(left) if(down) y--; else x--;
    16.      else if(up) if(left) x--; else y--;
    17.      else break;
    18.    }
    19.    return mtr;
    20. }
    21.   
    22. public static void printMatrix(int[][] mtr) { //输出
    23.    int w = mtr.length;
    24.    int h = mtr[0].length;
    25.    for(int i=0; i< h; i++) {
    26.      for(int j=0; j< w; j++) {
    27.        System.out.print(mtr[j][i] + "        ");
    28.      }
    29.      System.out.println ();
    30.    }
    31. }
    32.   
    33. public static void main(String[] args) {
    34.    int h = Integer.parseInt(args[0]);
    35.    int w = Integer.parseInt(args[1]);
    36.    printMatrix(makeMatrix(h,w));
    37. }
    38. }
    复制代码

      
       
       

         
       

         
       
      
    二、方法二     做出数学模型, 直接计算每一个坐标上的值, 这样就不用存放一个完整的矩阵在内存中, 要频繁引用的话,可以调用这个算法预先生成一个矩阵存起来。
    代码:
    1. /*
    2. * 作者:yanjj98
    3. * 基本思路:采用数学方法直接计算出矩阵元素P(x,y)的值.
    4. * 将整个矩阵看成由一个一个的矩形圈组成,矩阵中某一矩形圈上任意一点P(x,y)的值=
    5. * 位于外圈的所有点数+本圈处于点p(x,y)前面的所有点数+1
    6. */

    7. public class Martrix
    8. {
    9.    private int H;
    10.    private int L;

    11.    public static void main(String argv[])
    12.    {
    13.        int h = Integer.parseInt(argv[0]);
    14.        int w = Integer.parseInt(argv[1]);
    15.        Martrix m1=new Martrix(h,w);
    16.        m1.print();
    17.    }
    18.    
    19.    public Martrix()
    20.    {
    21.        this.H=3;
    22.        this.L=3;
    23.    }
    24.    public Martrix(int x,int y)
    25.    {
    26.        this.H=x;
    27.        this.L=y;
    28.    }

    29.    //计算点p(x,y)的值
    30.    public int getDotCount(int x,int y)
    31.    {
    32.        return getDotCount1(H,L,x,y) + getDotCount2(H,L,x,y) + 1;
    33.    }

    34.    //计算点P(x,y)外围矩形圈数
    35.    public static int getN(int H,int L,int x,int y)
    36.    {
    37.        return Math.min(Math.min(x,y),Math.min((H-x),(L-y)));
    38.    }

    39.    //计算点P(x,y)外围矩形圈上的点数 (等差数列,这个等差数列的公差为-8)
    40.    public static int getDotCount1(int H,int L,int x,int y)
    41.    {
    42.        int N=getN(H,L,x,y);//等差数列的项数
    43.        int S1=2*(H+L);     //等差数列的第一项,即最外围矩形上的点数
    44.        int S2=2*(H+L)-8*N + 8;//等差数列的第N项,即最后一圈矩形上的点数
    45.        return (S1+S2)/2 * N;  //返回等差数列的和
    46.    }

    47.    //计算与点P(x,y)处于同一个矩形圈上,且在点P前面的所有点数 (分段函数)
    48.    public static int getDotCount2(int H,int L,int x,int y)
    49.    {
    50.        int N=getN(H,L,x,y);
    51.        int x1=x-N;
    52.        int y1=y-N;
    53.        int H1=H-2*N;
    54.        int L1=L-2*N;
    55.        int count;


    56.        if(L1==0) //特列:H >=L ,L为奇数,y=(L-1)/2 实例(H=6,L=5,x=3,y=3)
    57.           return x1 ;

    58.        if(H1==0) //特列: H < L ,H为奇数,x=(H-1)/2 实例(H=5,L=6,x=3,y=3)
    59.           return y1;
    60.       
    61.        if(y1==0) //一般情况:
    62.        {
    63.            count=x1;
    64.        }
    65.        else if(x1==H1) //一般情况:
    66.        {
    67.            count=H1 + y1;
    68.        }
    69.        else if(y1==L1) //一般情况:
    70.        {
    71.            count=H1 + L1 + (H1 - x1);
    72.        }
    73.        else if(x1==0) //一般情况:
    74.        {
    75.            count=H1 + L1 + (H1 - x1) + (L1 - y1);
    76.        }
    77.        else  //出错情况:
    78.        {
    79.            count= -1;
    80.        }

    81.        return count;
    82.    }

    83.    //计算并输出螺旋矩阵
    84.    public void print()
    85.    {
    86.         System.out.println("H = " + H +" , " + "L = " + L);
    87.         System.out.println("******************************************");
    88.         for(int j=0;j<=L;j++)
    89.         {
    90.             for(int i=0;i<=H;i++)
    91.             {
    92.                 System.out.print(getDotCount(i,j)+"        ");
    93.             }
    94.             System.out.println();
    95.         }
    96.         System.out.println("************************************");
    97.    }
    98. }
    99. 一次运行图:
    100. D:java>java   Martrix 8 9
    101. H = 8 , L = 9
    102. ******************************************
    103. 1       2       3       4       5       6       7       8       9
    104. 34      35      36      37      38      39      40      41      10
    105. 33      60      61      62      63      64      65      42      11
    106. 32      59      78      79      80      81      66      43      12
    107. 31      58      77      88      89      82      67      44      13
    108. 30      57      76      87      90      83      68      45      14
    109. 29      56      75      86      85      84      69      46      15
    110. 28      55      74      73      72      71      70      47      16
    111. 27      54      53      52      51      50      49      48      17
    112. 26      25      24      23      22      21      20      19      18
    113. ************************************
    复制代码


      
      
       
       

         
       

         
       
      



    源码下载:http://file.javaxxz.com/2014/11/7/000348093.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 10:00 , Processed in 0.341323 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表