java 顺时针螺旋数组(只用一次for循环完成装填数据)

这里写图片描述
二话不说直接上图 顺时针输入螺旋数字

思路: 第一 先确定什么时候进入下一圈结束( 就是图上的 20 32 )
第二 确定什么时候开始转变趋势 比如 最外层 1到6 是横向向右递增的 6到11是向下增加的 11到16是向左增加的 16到11是向上增加的
第三 当前数字和当前数组横向坐标和竖向坐标建立关系。(这是最难的,需要考虑横向 纵向)

直接贴代码 :

 int number = Integer.parseInt(firstEt.getText().toString().trim());//    Android 程序  输入入口

                int[][] m = new int[number][number];// 建立数组
                m[0][0] = 1;
                int topleft = 1;// 左上角的数字    对应   1  21  33
                int topright = 1;// 右上角的数字    对应   6  24  34
                int bottomleft = 1;// 左下角的数字    对应   16  30  36
                int bottomright = 1;// 右下角的数字    对应  11  27  35

               int quanmax = 0;// 本圈的最大值  就是  20  32  36
                int quan = 1;// 圈数   1到20是第一圈    21到32是第二圈


                for (int i = 0; i <= Math.pow(number, 2); i++) {  // 循环装填
                   if (i == quanmax + 4 * (number + 1 - quan * 2)) {// 判断是否开始进入下一圈(某一圈的最后一个数字)
                        quanmax =quanmax+4 * (number + 1 - quan * 2);//   20  32  36  
                        m[quan][quan - 1] = i;
                        quan++;// 圈数++;
                    } else{
                        if (i == quanmax + 1) {// 左上角的数字判断 (某一圈的第一个数字) 对应   1  21  33
                            topleft = i;
                            m[quan - 1][quan - 1] = i;
                       } else if (i > topleft && i < topleft + 1 + number - 2 * quan) { //  左上角 到 右上角  从左到右   2到5  22到23
                            m[quan - 1][i - topleft + quan - 1] = i;
                        } else if (i == topleft + 1 + number - 2 * quan) {// // 右上角的数字    对应   6  24  34
                            topright = i;
                            m[quan - 1][number - quan] = i;
                        } else if (i > topright && i < topright + 1 + number - 2 * quan) {//  右上角 到 右下角  竖向  从上到下  7到10  25到26
                            m[i - topright + quan - 1][number - quan] = i;
                        } else if (i == topright + 1 + number - 2 * quan) {// 右下角的数字    对应  11  27  35
                            bottomright = i;
                            m[number - quan][number - quan] = i;
                        } else if (i > bottomright && i < bottomright + 1 + number - 2 * quan) {//  右下角 到 左下角  横向 从右到左  12到15  28到  29
                            m[number - quan][number + bottomright - i - quan] = i;
                        } else if (i == bottomright + 1 + number - 2 * quan) {//  左下角的数字    对应   16  30  36
                            bottomleft = i;
                            m[number - quan][quan - 1] = i;
                        } else if (i > bottomleft && i < quanmax+4*(number+1-2*quan)) {//  左下角 到 左上角  从下到上  17到19  31 到32
                            m[number + bottomleft - i - quan][quan - 1] = i;
                        }
                    }
                }
                开始打印
                for (int i = 0; i < number; i++) {
                    for (int j = 0; j < number; j++) {
                        if (m[i][j]<10){
                            sb.append(" " + m[i][j]);
                        }else{
                            sb.append("" + m[i][j]);
                        }
                    }
                    sb.append("\n");
                }
  resultTv.setText(sb.toString());

其中 firstEt是 edittext的id resultTv是textview

补充:有人认为定义的变量太多了 其实topright bottomleft bottomright quanmax 这些参数都可以用 topleft 加上一定的数字来表示 只是不太好理解了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值