矩阵,从左上角开始,顺时针打印该矩阵"/>
给一个MXN的矩阵,从左上角开始,顺时针打印该矩阵
- 单纯的打印矩阵我们都会。直接一个双重循环即可,但是如何从左上角开始,顺时针打印矩阵呢。我们可以设置四个变量,left,rigth,up,down分别表示当前矩阵没有打印的的边界距离,up=1.说明第一行已经打印,这样,我们向上遍历的时候,i=1的时候就可以停止了。同理,rigth,up,down也有类似的功能。代码如下:
- #include
#include
#include
using namespace std;
enum Dir {Up,Down,Left,Right};
int main()
{
srand((unsigned)time(NULL));
int **matrix;
int n = 2;
int m = 5;
matrix = new int [n];
for (int i = 0; i < n; i++)
{
matrix[i] = new int[m];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
matrix[i][j] = rand() % 50;
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << matrix[i][j] << “\t”;
}
cout << endl;
}
int left = 0;
int right = m;
int up = 0;
int down = n;
Dir cur = Right;
int istart = 0;
int jstart = 0;
int sum = 0;
while (left <= right || up <= down)
{
if (sum == mn)//先这么控制,因为在N和M不相等的时候,容易导致left <= right || up <= down始终有一个条件成立,出现死循环,导致bug。通过矩阵的元素个数可以实现控制。这个限制以后在考虑怎么修改。
{
break;
}
switch (cur)
{
case Right:
jstart = left;
while (jstart < right)
{
cout << matrix[istart][jstart] << " ";
sum++;
jstart++;
}
jstart–;//使jstart在矩阵范围内
up++;//更新上边界,更新打印的限制
cur = Down;
break;
case Down:
istart = up;
while (istart < down)
{
cout << matrix[istart][jstart] << " ";
sum++;
istart++;
}
istart–;使istart在矩阵范围内
right–;更新右边界,更新打印的限制
cur = Left;
break;
case Left:
jstart = right-1;
while (jstart >= left)
{
cout << matrix[istart][jstart] << " ";
sum++;
jstart–;
}
jstart++;使jstart在矩阵范围内
down–;更新下边界,更新打印的限制
cur = Up;
break;
case Up:
istart = down-1;
while (istart >= up)
{
cout << matrix[istart][jstart] << " ";
sum++;
istart–;
}
istart++;使istart在矩阵范围内
left++;更新左边界,更新打印的限制
cur = Right;
break;
}
}
system(“pause”);
return 0;
}
执行结果如下:
加了那个控制的花,可以比较好的打印结果。
更多推荐
给一个MXN的矩阵,从左上角开始,顺时针打印该矩阵
发布评论