输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。
这个题目代码写的并不好感觉,好多if看着就烦,就是提供一个思路,用一个标识矩阵flag来标识这个值是否被访问过。然后搜索方向变化为右、下、左、上。其实也可以逆时针的访问。
#include <iostream>
using namespace std;
void printMatrix (int **matrix, int i, int j);
enum direction
{ dir_left = 0, dir_right, dir_up, dir_down };
int main ()
{
int i = 4;
int j = 4;
int **matrix = new int *[i];
for (int m = 0; m < i; m++)
matrix[m] = new int[j] ();
int value = 0;
for (int m = 0; m < i; m++)
for (int n = 0; n < j; n++)
matrix[m][n] = ++value;
printMatrix (matrix, i, j);
return 0;
}
void printMatrix (int **matrix, int row, int col)
{
bool **flag = new bool *[row + 2];
for (int m = 0; m < row + 2; m++)
{
flag[m] = new bool[col + 2] ();
if (m == 0 || m == row + 1) //第一行与倒数第一行置为1
{
for (int n = 0; n < col + 2; n++)
flag[m][n] = 1;
}
else //这一行的第一列与最后一列置为1
{
flag[m][0] = 1;
flag[m][col + 1] = 1;
}
}
int flag_row = 1;
int flag_col = 1;
direction dir = dir_right;
for (int i = 0; i < row * col; i++)
{
cout << matrix[flag_row - 1][flag_col - 1] << " " << i << endl;
flag[flag_row][flag_col] = 1;
while (i != row * col - 1)//这个while是为了当方向为up跳到方向right的时候的循环,而且特别注意i的值为row*col-1就要结束
{
if (dir == dir_right)
{
if (flag[flag_row][flag_col + 1] == 0)
{
flag_col++;
break;
}
else
dir = dir_down;
}
if (dir == dir_down)
{
if (flag[flag_row + 1][flag_col] == 0)
{
flag_row++;
break;
}
else
dir = dir_left;
}
if (dir == dir_left)
{
if (flag[flag_row][flag_col - 1] == 0)
{
flag_col--;
break;
}
else
dir = dir_up;
}
if (dir == dir_up)
{
if (flag[flag_row - 1][flag_col] == 0)
{
flag_row--;
break;
}
else
dir = dir_right;
}
}
}
for (int i = 0; i < row + 2; i++)
{
for (int j = 0; j < col + 2; j++)
cout << flag[i][j] << " ";
cout << endl;
}
}