代码改变世界

螺旋式打印一个二维数组

  youxin  阅读(1697)  评论(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

 

编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
历史上的今天:
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中元素
点击右上角即可分享
微信分享提示