思路1:

将每一条斜线作为一层, 可以证明一共有 n+n-1 层, 即 2*n-1 层.  再对每一层分别进行扫描. 扫描一层需要知道起点(终点通过起点、变换方式和矩形范围可以唯一确定)和扫描的方向(偶数层一个方向, 奇数层一个方向)

  1. 1 #include <iostream>
  2. 2 using namespace std;
  3. 3
  4. 4 int n;
  5. 5 int arr[505][505]{0};
  6. 6
  7. 7 void paintDia(int level, bool isEven)
  8. 8 {
  9. 9 int x = level > n - 1 ? n - 1 : level;
  10. 10 int y = level > n - 1 ? level - n + 1 : 0;
  11. 11 if (!isEven)
  12. 12 swap(x, y);
  13. 13
  14. 14 while (x >= 0 && x < n && y >= 0 && y < n) {
  15. 15 if (x == n - 1 && y == n - 1)
  16. 16 cout << arr[x][y] << endl;
  17. 17 else
  18. 18 cout << arr[x][y] << \' \';
  19. 19
  20. 20 if (isEven) {
  21. 21 x--;
  22. 22 y++;
  23. 23 }
  24. 24 else {
  25. 25 x++;
  26. 26 y--;
  27. 27 }
  28. 28 }
  29. 29 }
  30. 30
  31. 31 int main()
  32. 32 {
  33. 33 ios::sync_with_stdio(false);
  34. 34 cin.tie(0);
  35. 35
  36. 36 cin >> n;
  37. 37 for (int i = 0; i < n; i++)
  38. 38 for (int j = 0; j < n; j++)
  39. 39 cin >> arr[i][j];
  40. 40
  41. 41 for (int l = 0; l < 2 * n - 1; l++)
  42. 42 paintDia(l, l % 2 == 0);
  43. 43
  44. 44 return 0;
  45. 45 }

 

思路2:

也可以将上三角和下三角分开处理.

  1. 1 #include <iostream>
  2. 2 using namespace std;
  3. 3
  4. 4 int n;
  5. 5 int arr[505][505];
  6. 6 bool flag;
  7. 7
  8. 8 void printComp(int x1, int y1, int x2, int y2)
  9. 9 {
  10. 10 int i = x1, j = y1;
  11. 11 if (x1 == n && x2 == n) {
  12. 12 cout << arr[n][n] << endl;
  13. 13 return;
  14. 14 }
  15. 15 if (!flag) {
  16. 16 // 斜向上
  17. 17 while (i >= 1 && j <= y2) {
  18. 18 cout << arr[i][j] << \' \';
  19. 19 i--;
  20. 20 j++;
  21. 21 }
  22. 22 }
  23. 23 else {
  24. 24 // 斜向下
  25. 25 while (i <= x2 && j >= 1) {
  26. 26 cout << arr[i][j] << \' \';
  27. 27 i++;
  28. 28 j--;
  29. 29 }
  30. 30 }
  31. 31 }
  32. 32
  33. 33 int main()
  34. 34 {
  35. 35 ios::sync_with_stdio(false);
  36. 36 cin.tie(0);
  37. 37
  38. 38 cin >> n;
  39. 39 for (int i = 1; i <= n; i++)
  40. 40 for (int j = 1; j <= n; j++)
  41. 41 cin >> arr[i][j];
  42. 42
  43. 43 flag = false;
  44. 44 for (int i = 1; i <= n; i++) {
  45. 45 if (!flag) printComp(i, 1, 1, i);
  46. 46 else printComp(1, i, i, 1);
  47. 47 flag = !flag;
  48. 48 }
  49. 49 for (int i = 2; i <= n; i++) {
  50. 50 if (!flag) printComp(n, i, i, n);
  51. 51 else printComp(i, n, n, i);
  52. 52 flag = !flag;
  53. 53 }
  54. 54
  55. 55 return 0;
  56. 56 }

版权声明:本文为AntonLiu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/AntonLiu/p/11164686.html