程序员面试题精选(39):一道autodesk笔试题求解

本文介绍了一种螺旋遍历矩阵的算法实现,该算法能够按照顺时针螺旋方向打印出给定M×N矩阵的所有元素。通过定义方向枚举、改变方向函数以及遍历函数,实现了对矩阵的有效遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 去年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;
}

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值