顺时针打印矩阵

来源:互联网 发布:2015中国造船数据分析 编辑:程序博客网 时间:2024/04/29 06:32

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

例如:如果输入如下矩阵:

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;    }}


 

原创粉丝点击