#include <vector>
#include <cstdlib>
#include <iostream>
using namespace std;
class matrix
{
public:
matrix(int);
void add();
void push();
void index(int, int &, int &);
void next(int, int, int &, int &);
friend ostream & operator<<(ostream &, matrix &);
private:
int n,p,q,id;
vector<vector<int> > array;
};
int main(int argc, char * argv[])
{
int t;
if ( argc < 2 )
t=10;
else
t=atoi(argv[1]);
matrix rectangle(t);
rectangle.add();
rectangle.push();
cout<<rectangle;
return 0;
}
matrix::matrix(int k):p(0),q(-1),id(0),n(k){}
void matrix::index(int line, int & row, int & col)
{
if ( line%2 )
++row;
else
++col;
}
void matrix::next(int num, int line, int & row, int & col)
{
if ( num+1 != line )
{
++row;
--col;
}
}
void matrix::add()
{
vector<int> v;
for(int i=0; i!=n; ++i)
{
array.push_back(v);
array[i].assign(n,0);
}
}
void matrix::push()
{
for(int i=1; i!=2*n; ++i)
{
if ( i <= n )
index(i,q,p);
else
index(i,p,q);
int j=(i > n)?2*n-i:i;
for(int k=0; k!=j; ++k)
{
array[p][q]=++id;
if ( i%2 )
next(k,j,p,q);
else
next(k,j,q,p);
}
}
}
ostream & operator<<(ostream & os, matrix & m)
{
for(int i=0; i!=m.n; ++i)
{
for(int j=0; j!=m.n; ++j)
{
os<<m.array[i][j]<<"\t";
if ( (j+1)%m.n == 0 )
os<<endl;
}
}
return os;
}
转载于:https://blog.51cto.com/expertshell/1093195