/////////////////////////////////////////////
// read in two ints then display the spiral

#include <iostream>
#include <vector>
#include <iomanip>
#include <sstream>
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::vector;
using std::setw;
using std::ostringstream;

typedef vector<vector<int> > IntVec2d;
typedef IntVec2d::iterator IntVec2dIter;

enum State
{
	Right,
	Down,
	Left,
	Up,
	STATE_FORCE_DWORD = 0xFFFFFFFF,
};

int main()
{
	int x=0, y=0, mx, my, lx=-1, ly=0, hx, hy;
	cout << "Enter two ints:" << endl;
	cin >> mx >> my;
	hx = mx;
	hy = my;
	State s = Right;
	int n;
	int max_n = mx*my;
	int padding;
	ostringstream oss;
	oss << max_n;
	padding = oss.str().length();

	IntVec2d v;
	v.resize(my);
	for(IntVec2dIter i = v.begin(); i != v.end(); i++)
	{
		i->resize(mx);
	}

	for(n=1; n <= max_n; n++)
	{
		v[y][x] = n;
		switch(s)
		{
		case Right:
			if(++x >= hx)
			{
				x = --hx;
				y++;
				s = Down;
			}
			break;
		case Down:
			if(++y >= hy)
			{
				y = --hy;
				x--;
				s = Left;
			}
			break;
		case Left:
			if(--x <= lx)
			{
				x = ++lx;
				y--;
				s = Up;
			}
			break;
		case Up:
			if(--y <= ly)
			{
				y = ++ly;
				x++;
				s = Right;
			}
			break;
		}
	}

	// output the vectors

	for(IntVec2dIter i = v.begin(); i != v.end(); i++)
	{
		for(vector<int>::iterator j = i->begin(); j != i->end(); j++)
		{
			cout << setw(padding) << *j << ' ';
		}
		cout << '\n';
	}

	cout << endl;

	return 0;
}

