#include <iostream>
#include "matrix.h"

using namespace amv;

template<class type>
void magicSquare(matrix<type> &m, int initialValue=1)
{
if(m.rows() != m.columns() || !(m.rows()%2))
	return;

int counter=0, items=m.rows()*m.columns(), i=0, j=m.columns()/2;

while(counter<items)
	{
	m[i][j]=initialValue;
	++initialValue;
	++counter;
	if(!(counter%m.columns()))
		{
		++i;
		if(i==m.rows())
			i=0;
		}
	else
		{
		--i; ++j;
		if(i<0)
			i=m.rows()-1;
		if(j==m.columns())
			j=0;
		}

	}

}

void main()
{
std::cerr<<"El cuadrado mágico - Matriz en la que la suma de los elementos de cada fila y de cada columna dan el mismo resultado\n\n";
int n,v=1;
std::cerr<<"Teclea el número de filas (impar) de la matriz cuadrada: ";
std::cin>>n;
std::cerr<<"Teclea el valor inicial (entero positivo): ";
std::cin>>v;
matrix<int> m1(n,n);
magicSquare(m1,v);

//si la matriz es grande, redireccionar la salida a un archivo de texto, para poder observarla bien
std::cout<<m1;
}