这段程序也是来源于工程,工程中需要我从矩阵的右上角开始,按指定的角度斜线遍历一个矩阵(也就是Z字形遍历),就像下图那样。
比如这样一个矩阵
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
按45度遍历输出的顺序就是:
3 2 7 1 6 11 0 5 10 15 4 9 14 8 13 12
#include <iostream>
using namespace std;
void main( void )
{
int m,n,p,i,j;
cout<<"m=";
cin>>m;
cout<<"n=";
cin>>n;
int *matrix = new int[m*n];
//初始化测试数组
for( i = 0 ; i < m*n; i++ )
{
matrix[i] = i;
}
float angle = 45.0;//以45度遍历
float tanAngle = tanf(angle /180.0*3.1415926);
for( p = n - 1; p >= -1*(m - 1); p-- )
{
for( i = 0; i <= ( n - 1- p ); i++ )
{
j = p + (int)( i*tanAngle + 0.5 );
if( i < m && j <n && j >= 0)
{
cout<<*(int*)( matrix + i*n + j )<<" ";
}
}
cout<<endl;
}
delete []matrix;
}
当angle不是45度时,可能因为计算j的时候,求tan再取整的原因,出现边缘的一些点没有遍历到。这是个BUG,还请有兴趣的朋友们一起寻找解决之道。(因为我的工程里一个大矩阵中少数几个点没有遍历到无关紧要,所以我就没有再深入地思考。)