去年5月參加Autodesk實習生招聘時的演算法題,當時時間緊,題量相當大,沒有來得及做這道題,之後也因為懶一直沒有做,小崔的答案發給我也沒看,今天突然想起來,就做了一下,比想像的要簡單一些:)
/*================================================================================
題目:給定一個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;
}