/*================================================================================
题目:给定一个M×N矩阵,从左上角元素开始,按照顺时针螺旋状打印所有矩阵元素
关键点:遍历过程的方向控制和左右界控制、上下界控制
作者:sunnyrain
日期:2007.9.3下午
运行环境:vc++ 6.0
==================================================================================*/
#include<iostream>
#include<vector>
using namespace std;
//定义方向
enum Direction{ToRight,Down,ToLeft,Up};
//改变方向函数
void turnDirect(Direction& cur)
{
switch(cur)
{
case ToRight:
cur = Down;
break;
case Down:
cur = ToLeft;
break;
case ToLeft:
cur = Up;
break;
case Up:
cur = ToRight;
break;
}
}
//遍历矩阵
void traverse(vector<vector<int> >& vv)
{
int m = vv[0].size();
int n = vv.size();
int up=0,down=n,left=0,right=m;
int i=0,j=0;
Direction curD = ToRight;
for(;up !=down || left != right;)
{
switch(curD)
{
case ToRight: //从左向右遍历
for(j=left;j<right;j++)
cout<<vv[i][j]<<" ";
cout<<endl;
--j; //列坐标出界回退
up++; //遍历完一行上界下移
turnDirect(curD); //改变遍历方向
break;
case Down: //从上向下遍历
for(i=up;i<down;i++)
cout<<vv[i][j]<<" ";
cout<<endl;
--i; //出界回退
right--; //遍历完一列右界左移
turnDirect(curD);
break;
case ToLeft: //从右向左遍历
for(j=right-1;j>=left;--j)
cout<<vv[i][j]<<" ";
cout<<endl;
++j; //出界回退
down--; //下界上移
turnDirect(curD);
break;
case Up: //从下向上遍历
for(i=down-1;i>=up;--i)
cout<<vv[i][j]<<" ";
cout<<endl;
++i; //出界回退
left++; //左界右移
turnDirect(curD);
break;
}
}
}
int main()
{
int m,n,i,j,k=0;
cout<<"please input the m and n of the matrix(m*n):"<<endl;
cin>>m>>n;
vector<vector<int> > vec(n);
//初始化矩阵
for(i=0;i<n;i++)
for(j=0;j<m;j++)
vec[i].push_back(++k);
//正常遍历矩阵
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<vec[i][j]<<"/t";
cout<<endl;
}
//顺时针螺旋遍历矩阵
traverse(vec);
return 0;
}