给定一个n行m列的二维数组,要求按顺时针螺旋顺序输出矩阵中的所有元素,n和m小于等于10
如下图是一个三行四列的螺旋矩阵

要求输出 1 2 3 4 8 12 11 10 9 5 6 7
- int a[11][11];
- int vis[11][11]; // 访问标记数组
关键代码如下
- int dx[] = {0, 1, 0, -1}; // 行方向
- int dy[] = {1, 0, -1, 0}; // 列方向
- int dir = 0; // dir: 0表示右, 1表示下, 2表示左, 3表示上,是顺时针的方向
- int num = 0;
- int i = 0,j = 0;
-
- while (num < m * n) { //输出完矩阵的所有元素就退出
- if (i >= 0 && i < n && j >= 0 && j < m && vis[i][j] == 0){//不超过边界且未被访问
- printf("%d ", a[i][j]);
- vis[i][j] = 1;
- num++;
- } else { // 否则回退一步,并切换方向
- i -= dx[dir];
- j -= dy[dir];
- dir = (dir + 1) % 4;
- }
- // 更新下一步位置
- i += dx[dir];
- j += dy[dir];
- }
给定矩阵的长度n,要求逆时针输出一个n*n螺旋矩阵
例如输入5,输出如下,要求每个元素间隔四个空格且左对齐,如下图

这题刚好跟上题相反,现在是输出螺旋矩阵,这里螺旋矩阵的方向是逆时针,所以方向向量需要改一下
- int dx[]={1,0,-1,0}; //逆时针是下、右、上、左
- int dy[]={0,1,0,-1};
- int n,i=0,j=0,num=1;
- int dir=0;
- scanf("%d",&n);
- while(num<=n*n){ //num一直加1,然后按顺序赋给数组元素,最后到n*n
- if(i>=0&&i
=0&&j0){ - a[i][j]=num;
- num++;
- visit[i][j]=1;
- }
- else{
- i-=dx[dir];
- j-=dy[dir];
- dir=(dir+1)%4;
- }
- i+=dx[dir];
- j+=dy[dir];
- }
- for(i=0;i
- for(j=0;j
- printf("%-4d",a[i][j]); //隔四个空格且左对齐
- }
- printf("\n");
- }
-
相关阅读:
PCL1.12.1+VTK9.1+Qt5.14.2VS创建Qt项目在widget上显示点云
【算法】高精度加、减、乘、除(C++实现)
Inksape 设置画布像素尺寸及透明背景
内网信息收集
认识doubbo和rpc
LeetCode 104. 二叉树的最大深度
Linux - 逻辑卷的创建和管理
原创: 一次 MySQL 误操作导致的事故,高可用都不顶不住!
两个不相交的闭集并不能保证两个集合可分
[Java安全]—Tomcat Servlet内存马
-
原文地址:https://blog.csdn.net/m0_62574258/article/details/140059105