• Java,回形数


             回形数基本思路:

            用不同的四个分支分别表示向右向下向左向上,假如i表示数组的行数,j表示数组的列数,向右向左就是控制j的加减,向上向下就是控制i的加减。

            

    1. class exercise
    2. {
    3. public static void main(String[] args)
    4. {
    5. //回形数的实现
    6. Scanner scan = new Scanner(System.in);
    7. int n = scan.nextInt();
    8. int[][] arr = new int[n][n];
    9. int x = n;//x和y是用来看还有多少列和行没被占用
    10. int y = n;//x表示列数,y表示行数
    11. int dir = 0;//dir用来控制方向
    12. int i = 0;//i和j用来控制数组列和行的赋值
    13. int j = 0;
    14. int count = 0;//count控制边界
    15. for (int a = 1; a <= n * n; a++)//产生1到n*n的数
    16. {
    17. if(dir % 4 == 0)//向右
    18. {
    19. arr[i][j] = a;
    20. j++;
    21. count++;
    22. if(count == x)//等于剩余的列数时就换方向
    23. {
    24. dir++;//换方向
    25. y -= 1;//行数减一
    26. i++;//设置下一个起点
    27. j--;//防止数组访问越界
    28. count = 0;//刷新count的值,用于下一次的方向的计数
    29. }
    30. }
    31. else if(dir % 4 == 1)//向下
    32. {
    33. arr[i][j] = a;
    34. i++;
    35. count++;
    36. if(count == y)
    37. {
    38. dir++;//换方向
    39. x -= 1;//列数减一
    40. j--;//设置下一个起点
    41. i--;//防止数组访问越界
    42. count = 0;
    43. }
    44. }
    45. else if(dir % 4 == 2)//向左
    46. {
    47. arr[i][j] = a;
    48. j--;
    49. count++;
    50. if(count == x)
    51. {
    52. dir++;
    53. y -= 1;
    54. i--;
    55. j++;
    56. count = 0;
    57. }
    58. }
    59. else if(dir % 4 == 3)//向上
    60. {
    61. arr[i][j] = a;
    62. i--;
    63. count++;
    64. if(count == y)
    65. {
    66. dir++;
    67. x -= 1;
    68. j++;
    69. i++;
    70. count = 0;
    71. }
    72. }
    73. }
    74. for (int k = 0; k < arr.length; k++)
    75. {
    76. for (int l = 0; l < arr[0].length; l++)
    77. {
    78. System.out.print(arr[k][l] + "\t\t");
    79. }
    80. System.out.println();
    81. }
    82. }
    83. }

             1.count是用来计算赋值的次数的,左右方向上,当赋值次数等于剩余列数时,就换方向。上下方向上,当赋值次数等于剩余行数时,就换方向。而x和y就是用来记录剩余的列数和行数的。

            2.换方向时,要把赋值的起点换一下,每次换起点都是让赋值对象变为下一个方向的下一个元素。如图:

             3.每次赋值到终点时,以第一次为例,最后还有一个j++,j会变为5,而接下来的向下应该时要保持j为4才行,j为5时会数组访问越界。所以要在后面的换方向的if里面加上一个j--,中和掉多余加出来的1.

            4.count要放在循环外面定义,防止count在循环内,被错误刷新。每次换方向时也要记得将count重新赋值为0,用于下一次的计数。

  • 相关阅读:
    vue中的provide/inject你知道吗(vue2、vue3)?
    Spring Boot + EasyExcel导入导出,简直太好用了!
    免费研讨会 | 邀您体验 Ansys Zemax Enterprise 的 STAR 模块
    Java成品网站推荐 毕设从这起步就够了
    Node.js学习笔记
    08Java算术运算符/除法与取模/隐式转换/强制转换/字符串相加/字符相加
    1.1 HTML4
    Yocto - 使用Yocto开发嵌入式Linux系统_11 调试Yocto项目
    1Panel应用推荐:Nginx Proxy Manager
    如何 dump 一个进程的 seccomp filters ?
  • 原文地址:https://blog.csdn.net/2302_79468488/article/details/133984187