fork download
  1. #include <array>
  2. #include <cstdlib>
  3.  
  4. namespace sehn {
  5. template <typename T, std::size_t N>
  6. using matrix = std::array<std::array<T, N>, N>;
  7.  
  8. template <typename T, std::size_t N>
  9. matrix<T, N> flipud (matrix<T, N> const &);
  10.  
  11. template <typename T, std::size_t N, int K>
  12. std::array<T, N - std::abs (K)> diag (matrix<T, N> const &);
  13. }
  14.  
  15. #include <iostream>
  16.  
  17. template <typename T, std::size_t N>
  18. std::array<int, 2 * N - 1> sum_diags (sehn::matrix<T, N> const &);
  19.  
  20. int main () {
  21. std::size_t const size (3);
  22. sehn::matrix<int, size> m { {
  23. 1, 2, 3,
  24. 10, 20, 30,
  25. 100, 200, 300
  26. } };
  27.  
  28. for (auto const &row : m) {
  29. for (auto const &item : row)
  30. std::cout << item << '\t';
  31. std::cout << std::endl;
  32. }
  33. std::cout << std::endl;
  34.  
  35. for (auto const &s : sum_diags (m))
  36. std::cout << s << '\t';
  37. std::cout << std::endl << std::endl;
  38.  
  39. auto f (sehn::flipud (m));
  40.  
  41. for (auto const &row : f) {
  42. for (auto const &item : row)
  43. std::cout << item << '\t';
  44. std::cout << std::endl;
  45. }
  46. std::cout << std::endl;
  47.  
  48. for (auto const &s : sum_diags (f))
  49. std::cout << s << '\t';
  50. std::cout << std::endl << std::endl;
  51.  
  52. return 0;
  53. }
  54.  
  55. #include <iterator>
  56. #include <numeric>
  57. #include <type_traits>
  58.  
  59. template <typename T, std::size_t N, int K>
  60. typename std::enable_if<K < static_cast<int> (N) - 1>::type
  61. sum_diags_impl (sehn::matrix<T, N> const &, std::array<int, 2 * N - 1> &);
  62.  
  63. template <typename T, std::size_t N, int K>
  64. typename std::enable_if<K == static_cast<int> (N) - 1>::type
  65. sum_diags_impl (sehn::matrix<T, N> const &, std::array<int, 2 * N - 1> &);
  66.  
  67. template <typename T, std::size_t N>
  68. std::array<int, 2 * N - 1> sum_diags (sehn::matrix<T, N> const &source) {
  69. std::array<int, 2 * N - 1> sums;
  70. sum_diags_impl<T, N, -N + 1> (source, sums);
  71. return sums;
  72. }
  73.  
  74. template <typename T, std::size_t N, int K>
  75. typename std::enable_if<K < static_cast<int> (N) - 1>::type
  76. sum_diags_impl (sehn::matrix<T, N> const &matrix, std::array<int, 2 * N - 1> &sums) {
  77. auto diag = sehn::diag<T, N, K> (matrix);
  78. sums[N - 1 + K] = std::accumulate (std::begin (diag), std::end (diag), T{});
  79. sum_diags_impl<T, N, K + 1> (matrix, sums);
  80. }
  81.  
  82. template <typename T, std::size_t N, int K>
  83. typename std::enable_if<K == static_cast<int> (N) - 1>::type
  84. sum_diags_impl (sehn::matrix<T, N> const &matrix, std::array<int, 2 * N - 1> &sums) {
  85. auto diag = sehn::diag<T, N, K> (matrix);
  86. sums[N - 1 + K] = std::accumulate (std::begin (diag), std::end (diag), T{});
  87. }
  88.  
  89. #include <utility>
  90.  
  91. namespace sehn {
  92. template <typename T, std::size_t N>
  93. matrix<T, N> flipud (matrix<T, N> const &source) {
  94. matrix<T, N> clone (source);
  95.  
  96. for (std::size_t i (0); i < N / 2; ++i)
  97. std::swap (clone[i], clone[N - 1 - i]);
  98.  
  99. return clone;
  100. }
  101.  
  102.  
  103. template <typename T, std::size_t N, int K>
  104. std::array<T, N - std::abs (K)> diag (matrix<T, N> const &source) {
  105. std::array<T, N - std::abs (K)> tmp;
  106.  
  107. for (std::size_t i (0); i < N; ++i) {
  108. std::size_t j (i + K);
  109. if (j < N)
  110. tmp[std::min (i, j)] = source[i][j];
  111. }
  112.  
  113. return tmp;
  114. }
  115. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
1	2	3	
10	20	30	
100	200	300	

100	210	321	32	3	

100	200	300	
10	20	30	
1	2	3	

1	12	123	230	300