fork download
  1. #include <vector>
  2. #include <memory> // for auto_ptr
  3. #include <cmath> // for the log10 and floor functions
  4. #include <iostream>
  5. #include <iomanip> // for the setw function
  6.  
  7. using namespace std;
  8.  
  9. typedef vector< int > IntRow;
  10. typedef vector< IntRow > IntTable;
  11.  
  12. auto_ptr< IntTable > getZigZagArray( int dimension )
  13. {
  14. auto_ptr< IntTable > zigZagArrayPtr( new IntTable(
  15. dimension, IntRow( dimension ) ) );
  16.  
  17. // fill along diagonal stripes (oriented as "/")
  18. int lastValue = dimension * dimension - 1;
  19. int currNum = 0;
  20. int currDiag = 0;
  21. int loopFrom;
  22. int loopTo;
  23. int i;
  24. int row;
  25. int col;
  26. do
  27. {
  28. if ( currDiag < dimension ) // if doing the upper-left triangular half
  29. {
  30. loopFrom = 0;
  31. loopTo = currDiag;
  32. }
  33. else // doing the bottom-right triangular half
  34. {
  35. loopFrom = currDiag - dimension + 1;
  36. loopTo = dimension - 1;
  37. }
  38.  
  39. for ( i = loopFrom; i <= loopTo; i++ )
  40. {
  41. if ( currDiag % 2 == 0 ) // want to fill upwards
  42. {
  43. row = loopTo - i + loopFrom;
  44. col = i;
  45. }
  46. else // want to fill downwards
  47. {
  48. row = i;
  49. col = loopTo - i + loopFrom;
  50. }
  51.  
  52. ( *zigZagArrayPtr )[ row ][ col ] = currNum++;
  53. }
  54.  
  55. currDiag++;
  56. }
  57. while ( currDiag <= lastValue );
  58.  
  59. return zigZagArrayPtr;
  60. }
  61.  
  62. void printZigZagArray( const auto_ptr< IntTable >& zigZagArrayPtr )
  63. {
  64. size_t dimension = zigZagArrayPtr->size();
  65.  
  66. int fieldWidth = static_cast< int >( floor( log10(
  67. static_cast< double >( dimension * dimension - 1 ) ) ) ) + 2;
  68.  
  69. size_t col;
  70. for ( size_t row = 0; row < dimension; row++ )
  71. {
  72. for ( col = 0; col < dimension; col++ )
  73. cout << setw( fieldWidth ) << ( *zigZagArrayPtr )[ row ][ col ];
  74. cout << endl;
  75. }
  76. }
  77.  
  78. int main()
  79. {
  80. printZigZagArray( getZigZagArray( 5 ) );
  81. }
Success #stdin #stdout 0.01s 5520KB
stdin
Standard input is empty
stdout
  0  1  5  6 14
  2  4  7 13 15
  3  8 12 16 21
  9 11 17 20 22
 10 18 19 23 24