1. #include <stdio.h>
    2. #include<stdlib.h>
    3. #include<math.h>
    4. #include<string.h>
    5. #include<stdbool.h>
    6. void process() { //
    7. int m;
    8. int n;
    9. scanf("%d%d", &m, &n);
    10. int i = 0, j = 0;
    11. int a[100][100] = { 0 };
    12. int flag = 1;
    13. int col = 0, row = 0;
    14. int count = 1;
    15. int max = m > n ? m : n;
    16. int min = m < n ? m : n; // 都转成方差
    17. int sign = 0;
    18. for (i = 0; i < max; i++) { // 上三角
    19. col = i;
    20. row = 0;
    21. //if (i == min)break;
    22. if (flag == 0) { // 顺序 从上往下
    23. while (col > n - 1) {
    24. col--;
    25. row++;
    26. }
    27. while ((col >= 0) && (row < m)) {
    28. a[row][col] = count++;
    29. row++;
    30. col--;
    31. }
    32. flag = 1;
    33. }
    34. else { // flag ==0
    35. col = 0; row = i;
    36. while (row > m - 1) {
    37. row--;
    38. col++;
    39. }
    40. while ((col < n) && (row >= 0) && (row < m)) { // 逆序 从下往上
    41. a[row][col] = count++;
    42. row--;
    43. col++;
    44. sign = 1; // 下一次从上到下
    45. }
    46. if (sign) flag = 0;
    47. sign = 0;
    48. }
    49. }
    50. for (i = 1; i < max; i++) { // 下三角
    51. col = i; row = max-1;
    52. if (i == min) break;
    53. if (flag == 1) { // 从下往上
    54. while (row > m-1) {
    55. col++;
    56. row--;
    57. }
    58. while ((col < n) && (row >= 0)) {
    59. a[row][col] = count++;
    60. col++;
    61. row--;
    62. flag = 0;
    63. }
    64. }
    65. else { //从上往下 flag ==0
    66. row = i;
    67. col = max-1;
    68. while (col>n-1)
    69. {
    70. col--;
    71. row++;
    72. }
    73. while ((row < m) && (col > 0) && (col < n)) {
    74. a[row][col] = count++;
    75. col--;
    76. row++;
    77. flag = 1;
    78. }
    79. }
    80. }
    81. for (i = 0; i < m; i++) {
    82. for (j = 0; j < n; j++) {
    83. printf("%d ", a[i][j]);
    84. }
    85. printf("\n");
    86. }
    87. }
    88. int main() {
    89. process();
    90. }

    遍历矩阵的方式:寻找下一次移动与当前移动的关系