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

来源:互联网 发布:安卓好友定位软件 编辑:程序博客网 时间:2024/06/02 04:48

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

思路: 第一 先确定什么时候进入下一圈结束( 就是图上的 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 加上一定的数字来表示 只是不太好理解了。

原创粉丝点击