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