/* transpose2.cpp - Transpose an n x n matrix
 */

#include <iostream>
#include <iomanip>
using namespace std;

// a is an n by n matrix. It is transposed in place.
void transpose (int a[], int n)
{
  int * pb = a;
  int * qb = a;
  for (int row = 1; row < n; row++) {
    pb += n;
    qb += 1;
    int * p = pb;
    int * q = qb;
    for (int column = 0; column < row; ++column) {
      int temp = *p;
      *p = *q;
      *q = temp;
      p++;
      q += n;
    }
  } 
}

//a is an n by n matrix. It is printed
//out n elements per line
void printnxn(const int a[], int n)
{
  const int *p = a;
  for (int row = 0; row < n; row++) {
    for (int column = 0; column < n; column++) 
      cout << setw(3) << *p++;
    cout << endl;
  }
}

int
main()
{
  int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
  printnxn((int *)a, 4);
  transpose((int *)a, 4);
  printnxn((int *)a, 4);
  return 0;
}
