顺时针打印矩阵

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

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

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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值