螺旋式打印一个二维数组

http://blog.csdn.net/lonelywinter340/article/details/3292686



          思路有很多,最容易想到的方法就是设置一个表示方向的变量,根据当前的方向来判断下一步的操作,当到达边界的时候方向顺时针改变。另外有一个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}
};
int  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 ++;         // 列的开始坐标增加
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值