回形数.比如输入9
输出:
//顺时针旋转
1 2 3
8 9 4
7 6 5
初次自己尝试的时候发生了二维数组最容易出现的空指针错误。后面越写越觉得逻辑不对,随即放弃
第二次,对参考代码进行学习,给源代码加上自己理解的注释
第三次,注释参考代码,自己打了一遍。发生错误。在for循环中要想每次if语句完之后执行for语句中的m++,必须将非首次的if写为else if 否则不会跳出。
代码:public class Exc1 { public static void main(String[] args) { System.out.println("请输入一个n*n的数字"); Scanner scan = new Scanner(System.in); int len = scan.nextInt(); int s = (int) Math.sqrt(len); int[][] arr = new int[s][s];//动态初始化一个n行n列的二维数组 // k = 1:向右 k = 2:向下 k = 3:向左 k = 4:向上 int k = 1; int i = 0, j = 0; for (int m = 1; m <= len; m++) { //如果第i行没有值,向右依次给i行j列赋值;否则标记k为2,同时i+1 if (k == 1) { if (j < s && arr[i][j] == 0) { arr[i][j++] = m; } else { k = 2; i++; j--; m--; } //如果第j列没有值,向下依次给i行j列赋值;否则标记k为3,同时j-1 } else if (k == 2) { if (i < s && arr[i][j] == 0) { arr[i++][j] = m; } else { k = 3; i--; j--; m--; } //如果第i行没有值,向左依次给i行j列赋值;否则标记k为4,同时i-1 } else if (k == 3) { if (j >= 0 && arr[i][j] == 0) { arr[i][j--] = m; } else { k = 4; i--; j++; m--; } //如果第j列没有值,向上依次给i行j列赋值;否则标记k为1,同时j+1 } else if (k == 4) { if (i >= 0 && arr[i][j] == 0) { arr[i--][j] = m; } else { k = 1; i++; j++; m--; } } }
运行结果: