Company A 面试 笔试 : 按一定的规则打印数组的问题

25 篇文章 0 订阅

要求: 输入一个数组元素, 

1) 从左边往右打印数组元素,然后到边或者碰到已经打印过的,

2)  则按45°向左下角方向打印,

3) 到底后,向左水平打印,

4)  到头后再按垂直方向向上打印,

5) 碰到已经打印过的,则重复上述1-4这一系列完整的过程。


代码如何,个人调试并通过:

//按递归方法,注意边界条件。


#include < map >
#include < se t>
#include < list >
#include < cmath >
#include < ctime>
#include < deque>
#include < queue>
#include < stack>
#include < bitset>
#include < cstdio>
#include < limits>
#include < vector>
#include < cstdlib>
#include < numeric>
#include < sstream>
#include < iostream>
#include < algorithm>
using namespace std;


map<int,bool> printednodeMap; //indicate that this node in one-demension is visited or not.
 map<int,bool>::iterator it;
 vector<int> outdata;


 int Matrixwidth,Matrixheight;


 //(x1,y1) start point ; (x2, y2) end point
 
 //recursively to print out data
 
void vistnode(int x1,int y1,int x2, int y2, int **data){
    if(x1 >= Matrixwidth || y1 >= Matrixheight)
        return;
    if(x1 >x2 || y1 > y2)
        return;
    
    int row,column;
   //to right
   for(column=x1;column<=x2;column++){
    if(printednodeMap[y1*Matrixwidth+column]==true) {
       //printed
        break;
    }       
     outdata.push_back(data[y1][column]);
     printednodeMap[y1*Matrixwidth+column]=true;
  }
  //to leftdown
  column-=2;
  row=y1+1;
  while((column>=x1)&&(row<=y2)) {
    if(printednodeMap[row*Matrixwidth+column]==true){
        //printed
       //return;
        break;
      }
    
     outdata.push_back(data[row][column]);
     printednodeMap[row*Matrixwidth+column]=true;
    column--;
    row++;
  }
    //back 
     row--;
     column++;
    //to left 
  while(column> x1){
      column--;
      if(printednodeMap[row*Matrixwidth+column]==true){
      //printed
         return;
      }
     outdata.push_back(data[row][column]);
     printednodeMap[row*Matrixwidth+column]=true;     
  }
  //  to up
   row--;
    while(row>=y1){
      if(printednodeMap[row*Matrixwidth+column]==true){
        //printed
       break;         
      }      
      outdata.push_back(data[row][column]);
      printednodeMap[row*Matrixwidth+column]=true;  
     row--;  
    }
    vistnode(x1+1,y1+1,x2-1,y2-1,data);
}


vector<int> convertMatrix(int width, int height, vector<int> matrix) {
  Matrixwidth=width;
  Matrixheight=height; 
  //or define  
  //make **data
   int **data=new int *[height];


  //BTW define int data[height][width]; is also OK in C++
  
  for(int index=0;index<height;index++){
    data[index]=new int[width]; 
  }
 // OK to define here dynamically
 // such as int data[height][width];
 
  //convert one-dimension values saved vector into value of two-dimension matrix 
 int i,j;
 for(i=0;i<height;i++){
    for(j=0;j<width;j++) {
        data[i][j]=matrix[ i* width + j];
    }
 }
 
 for(i=0;i<height*width;i++){
  printednodeMap[i]=false;   
 }
 //first print
  vistnode(0,0,width-1,height-1,data);  
  return outdata;   
 
}
int main() {
    vector <int> res;
    int _width;
    
    cout<<"input array width: ";
    cin >> _width;
    
    int _height;
    cout<<endl<<"input array height: ";
    cin >>_height;
    
    vector<int> _matrix;
    int _matrix_item;
    cout<<"input array elements "<<endl;
    
    for(int _matrix_i=0; _matrix_i<_width * _height; _matrix_i++) {
        //cin will read char until meeting non-digit chars such as space char
        //if user enter 3 5 8, then cin will assign them this matrix_item three times
        cin >> _matrix_item;
        _matrix.push_back(_matrix_item);
    }
    //user fill in codes
    res = convertMatrix(_width, _height, _matrix);
    for(int res_i=0; res_i < res.size(); res_i++) {
    cout << res[res_i] << " ";
    }
    
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值