要求: 输入一个数组元素,
1) 从左边往右打印数组元素,然后到边或者碰到已经打印过的,
2) 则按45°向左下角方向打印,
3) 到底后,向左水平打印,
4) 到头后再按垂直方向向上打印,
5) 碰到已经打印过的,则重复上述1-4这一系列完整的过程。
代码如何,个人调试并通过:
//按递归方法,注意边界条件。
#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;
}