• java构建n阶魔方方阵


    1. package dataStructure;
    2. import java.util.Arrays;
    3. import java.util.Scanner;
    4. /*
    5. * 构造魔方方阵
    6. */
    7. public class Magic_Matrix {
    8. public static void main(String args[]) {
    9. Scanner input = new Scanner(System.in);
    10. System.out.print("请输入方阵阶数:");
    11. int n = input.nextInt();
    12. Magic_Matrix matrix = new Magic_Matrix();
    13. int[][] magic_marix = null;
    14. if(n % 2 == 1) {
    15. magic_marix = matrix.build_Matrix_method1(n);
    16. }else if(n % 4 == 0) {
    17. magic_marix = matrix.build_Matrix_method2(n);
    18. }else {
    19. magic_marix = matrix.build_Matrix_method3(n);
    20. }
    21. for(int[] temp:magic_marix) {
    22. System.out.println(Arrays.toString(temp));
    23. }
    24. }
    25. /*
    26. * n为被4整除的偶数
    27. */
    28. public int[][] build_Matrix_method2(int n){
    29. int[][] magic_matrix = new int[n][n];
    30. for(int indexI =0, indexJ =0,i = 1;i<=n*n;i++) {
    31. magic_matrix[indexI][indexJ] = i;
    32. indexJ = indexJ+1;
    33. if(indexJ == n) {
    34. indexI = indexI+1;
    35. indexJ = 0;
    36. }
    37. }
    38. int temp = n/4;
    39. for(int indexI = 0;indexI < n;indexI++) {
    40. if(indexI % 4 == 0 || indexI % 4 == 3) {
    41. for(int indexJ = 0;indexJ < temp ;indexJ++) {
    42. magic_matrix[indexI][4*indexJ] = n*n+1 - magic_matrix[indexI][4*indexJ];
    43. magic_matrix[indexI][4*indexJ+3] = n*n+1 - magic_matrix[indexI][4*indexJ+3];
    44. }
    45. }else {
    46. for(int indexJ = 0; indexJ < temp; indexJ++){
    47. magic_matrix[indexI][4*indexJ + 1] = n*n+1 - magic_matrix[indexI][4*indexJ + 1];
    48. magic_matrix[indexI][4*indexJ + 2] = n*n+1 - magic_matrix[indexI][4*indexJ + 2];
    49. }
    50. }
    51. }
    52. return magic_matrix;
    53. }
    54. /*
    55. * n为不能被4整除的偶数
    56. */
    57. public int[][] build_Matrix_method3(int n){
    58. int[][] magic_matrix = new int[n][n];
    59. int indexI = 0,indexJ = n/4,temp = (n-2)/4;
    60. magic_matrix[indexI][indexJ] = 1;
    61. for(int i =2;i<=n*n/4;i++) {
    62. int indexI_last = indexI;
    63. int indexJ_last = indexJ;
    64. indexI = indexI-1;
    65. indexJ = indexJ +1;
    66. if(indexI < 0) {
    67. indexI = n/2-1;
    68. }
    69. if(indexJ == n/2) {
    70. indexJ = 0;
    71. }
    72. if(magic_matrix[indexI][indexJ] != 0) {
    73. indexI = indexI_last +1;
    74. indexJ = indexJ_last;
    75. if(indexI == n/2) {
    76. indexI = 0;
    77. }
    78. }
    79. magic_matrix[indexI][indexJ] = i;
    80. }
    81. for(indexI = 0; indexI< n/2; indexI++){
    82. for(indexJ = 0; indexJ < n/2; indexJ++){
    83. magic_matrix[indexI + n/2][indexJ] = magic_matrix[indexI][indexJ] + 3*n*n/4;
    84. magic_matrix[indexI][indexJ + n/2] = magic_matrix[indexI][indexJ] + n*n/2;
    85. magic_matrix[indexI + n/2][indexJ + n/2] = magic_matrix[indexI][indexJ] + n*n/4;
    86. }
    87. }
    88. int tempValue = 0;
    89. for(indexI = 0; indexI< n/2; indexI++){
    90. for(indexJ = 0; indexJ < temp; indexJ++){
    91. if(indexI == n/4){
    92. tempValue = magic_matrix[n/4][n/4 + indexJ];
    93. magic_matrix[n/4][n/4 + indexJ] = magic_matrix[3*n/4][n/4 + indexJ];
    94. magic_matrix[3*n/4][n/4 + indexJ] = tempValue;
    95. }else{
    96. tempValue = magic_matrix[indexI][indexJ];
    97. magic_matrix[indexI][indexJ] = magic_matrix[indexI + n/2][indexJ];
    98. magic_matrix[indexI + n/2][indexJ] = tempValue;
    99. }
    100. }
    101. }
    102. if(temp > 1){
    103. for(indexI = 0; indexI< n/2; indexI++){
    104. for(indexJ = 0; indexJ < temp-1; indexJ++){
    105. tempValue = magic_matrix[indexI][3*n/4 - indexJ];
    106. magic_matrix[indexI][3*n/4 - indexJ] = magic_matrix[indexI + n/2][3*n/4 - indexJ];
    107. magic_matrix[indexI + n/2][3*n/4 - indexJ] = tempValue;
    108. }
    109. }
    110. }
    111. return magic_matrix;
    112. }
    113. /*
    114. * n为奇数
    115. * ,当n为奇数时,逻辑最简单
    116. * 1.将1放到第一行中间以列
    117. * 2.从2开始知道n*n,各数依靠如下规则放置
    118. * 每一个数字存放的行比上一个数字的行减1,列加1
    119. * 例如当n=3时,1放在第一行的第二列,则2放在最后一行的第3列
    120. */
    121. public int[][] build_Matrix_method1(int n){
    122. int[][] magic_matrix = new int[n][n];
    123. int indexI = 0;
    124. int indexJ = n/2;
    125. int value = 1;
    126. while(value <= n*n) {
    127. magic_matrix[indexI][indexJ] = value;
    128. value++;
    129. if(value % n == 1) {
    130. indexI++;
    131. }else {
    132. indexI--;
    133. indexJ++;
    134. if(indexI < 0) {
    135. indexI = n-1;
    136. }
    137. if(indexJ > n-1) {
    138. indexJ = 0;
    139. }
    140. }
    141. }
    142. return magic_matrix;
    143. }
    144. }

  • 相关阅读:
    java序列化与反序列化
    添加过的PDF注释可以修改吗?怎么修改PDF注释?
    【Hugging Face】如何下载模型文件
    FSOD论文阅读 - 基于卷积和注意力机制的小样本目标检测
    Dubbo 3 StateRouter:下一代微服务高效流量路由
    类加载中的执行顺序
    C++面试八股文:用过std::set/std::map吗?
    Java 208 道面试题:Java 基础模块答案
    TikTok视频没播放,涨粉难?狠抓5点,TikTok运营so easy!
    C++中static_cast和dynamic_cast强制类型转换
  • 原文地址:https://blog.csdn.net/sunny_daily/article/details/127637192