程式員面試題精選(39):一道autodesk筆試題求解

來源:互聯網
上載者:User
 去年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;
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.