螺旋式打印一个二维数组
2014-07-09 14:30 youxin 阅读(1700) 评论(0) 编辑 收藏 举报问题描述:螺旋式打印一个二维数组。如
1 16 3 2 17
8 6 4 3 23
2 5 7 8 12
21 2 4 6 13
要求打印后顺序为:
1 16 3 2 17 23 12 13 6 4 2 21 2 8 6 4 3 8 7 5
此题的思路有很多中,最容易想到的方法就是设置一个表示方向的变量,根据当前的方向来判断下一步的操作,当到达边界的时候方向顺时针改变。另外有一个bool型的数组来表示相应位置是否被访问过,初始化都是0(未访问),当输出一个数就把相应位置的标记置为1。在前方向上如果碰到已经被访问过的位置就顺时针改变方向,一直到最后所有位置的数都访问位置。
一种比较简单的算法。在输出的时候可以给水平方向和垂直方向各设置两个坐标,start_x, end_x, start_y, end_y, 分别表示当前水平方向输出区间应该在start_x和end_x之间,垂直方向输出区间在start_y和end_y直接,每次转弯的时候只需要改变区间的边界就可以了。具体代码如下:
#include<iostream> using namespace std; int arr[6][5]= {{1, 16, 3, 2, 17}, {8, 6, 4, 3, 23}, {2, 5, 7, 8, 12}, {21, 2, 4, 6, 13}, {11, 111, 111, 132, 12}, {31, 311, 4111, 332, 32} }; void main() { // 初始的区间坐标 int startX = 0, endX = 4; int startY = 0, endY = 5; while(startX<=endX && startY<=endY) // 循环条件 { int i; for(i=startX; i<=endX; i++) // 输出上边的行 cout << arr[startY][i] << " "; startY ++; // 行的开始坐标增加 for(i=startY; i<=endY; i++) // 输出右边的列 cout << arr[i][endX] << " "; endX --; // 列的结束坐标减小 for(i=endX; i>=startX; i--) // 输出下边边的行 cout << arr[endY][i] << " "; endY --; // 行的结束坐标减小 for(i=endY; i>=startY; i--) // 输出左边的列 cout << arr[i][startX] << " "; startX ++; // 列的开始坐标增加 } }
参考:http://blog.csdn.net/lonelywinter340/article/details/3292686
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2013-07-09 linux shell 执行多个命令的方法
2013-07-09 linux中grep的用法 查找两个文件的相同之处,不同之处
2013-07-09 Shell中的正则表达式及字符串处理
2013-07-09 转:shell比较两个字符串是否相等
2013-07-09 UNIX 缩写风格
2013-07-09 转:.Net程序员学习Linux最简单的方法
2012-07-09 c++ 用lambda删除vector中元素