[C++日常小题] 三角螺旋数组

三角螺旋数组输出示例

大小为 5 时输出:

1       2       3       4       5
12      13      14      6
11      15      7
10      8
9

大小为 7 时输出:

1       2       3       4       5       6       7
18      19      20      21      22      8
17      27      28      23      9
16      26      24      10
15      25      11
14      12
13

代码

#include <iostream>
#include <iomanip>
#define SIZE 7  // 数组大小
using std::cout;
using std::endl;
using std::setw;
int main() {
    int num[SIZE][SIZE] = {0}, flag = 0;  // flag变量用来标记赋值方向
    int x = 0, y = 0, count = 1;  // 使用(x, y) 坐标来给数组赋值
    while (count <= (SIZE + 1) * SIZE / 2) {  // 总的个数为 (1+n)*n/2 个(等差数列)
        if (0 == flag) {  // 先水平向右赋值
            // horizontal: flag == 0
            for (int j = 0; j < SIZE; ++j) {
                if (num[x][y] != 0) {  // 当碰到非 0 值时退出,下同
                    break;
                } else {
                    num[x][y++] = count++;
                }
            }
            x++, y -= 2;  // 更新(x, y) 为下一个方向做准备,下同
            flag = 1;
        } else if (1 == flag) {  // 斜向左下赋值
            // hypotenuse: flag == 1
            for (int j = 0; j < SIZE; ++j) {
                if (y < 0 || num[x][y] != 0) {
                    x--, y++;  // 第一次向左下赋值的时候y可能越界到-1,并且之后的斜向赋值碰
                    break;     // 到不为0的值得位置时,要还原坐标
                } else {
                    num[x++][y--] = count++;
                }
            }
            x--;
            flag = 2;
        } else {
            // vertical: flag == 2
            for (int j = 0; j < SIZE; ++j) {
                if (num[x][y] != 0) {
                    break;
                } else {
                    num[x--][y] = count++;
                }
            }
            x++, y++;
            flag = 0;
        }
    }
    for (int i = 0; i < SIZE; ++i) {  // 输出
        for (int j = 0; j < SIZE - i; ++j) {
            cout << setw(5) << setiosflags(std::ios::left) << num[i][j];
        }
        cout << endl;
    }
    return 0;
}

附加

通过使用(x, y)坐标来进行赋值,个人感觉比较易于理解和编写代码。另外经过搜索,看到了其他的方法,特此附上代码:

C语言实现

#include <stdio.h>
#include <stdlib.h>
#define N 4
int main() {
    int i = 0,j = 0, m, n, t = 1, a[N][N];
    for(m = 0; m <= (int)(N / 2); m++) {
        //N行螺旋共有N*(N+1)/2个数
        for(j = m; j <= N - 1 - 2 * m; j++) { //横循环
            a[m][j] = t++;
        }
        for(j = m + 1; j <= N - 1 - 2 * m; j++) { //斜边循环
            a[j][N - 2 * m - (j - m) - 1] = t++;
        }
        for(j = N - 2 * m - 2; j >= m + 1; j--) { //竖列循环
            a[j][m] = t++;
        }
    }
    for(i = 0; i <= N - 1; i++) {
        for(j = 0; j <= N - 1 - i; j++) {
            printf("%5d", a[i][j]);
        }
        printf("\n");
    }
    system("PAUSE");
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值