控制组二面考题“螺旋阶梯“思路及代码

控制组-叶健鹏 2023-10-21 21:46:50
  1. 初始化一个n * n的二维数组,用0填充所有位置

  2. 定义四个变量,a、b、c和d,分别表示当前层的左、右、上、下四个边界位置。初始时、a、c均为0,b为n-1,d为n-1

  3. 定义一个计数器num,从1开始依次填充数组元素。依次按照从左到右、从上到下、从右到左、从下到上的顺序,填充当前层剩余的元素,直到所有元素都被填充完毕。

  4. 如果向右填充,应该在第c行从a到b填充;如果向下填充,应该在第b列从c+1到d填充;如果向左填充,应该在第d行从b-1到a填充;如果向上填充,应该在第a列从d-1到c+1填充。

  5. 当前层的元素填充完毕后,更新左、右、上、下四个边界位置,并进入下一层,重复上述步骤填充下一层。直到所有层都被填充完毕为止。

  6. 如下为代码详情:

    #include <stdio.h>
    int main() {
        int n;
        scanf("%d", &n);
        int arr[20][20] = { 0 };
        int a = 0, b = n - 1, c = 0, d = n - 1;
        int num = 1;
        while (a <= b && c <= d) {
            // 向右填充
            for (int i = a; i <= b; ++i) {
                arr[c][i] = num++;
            }
            ++c;

            // 向下填充
            for (int i =c; i <= d; ++i) {
                arr[i][b] = num++;
            }
            --b;

            // 向左填充
            if (a<= b) {
                for (int i = b; i >= a; --i) {
                    arr[d][i] = num++;
                }
                --d;
            }

            // 向上填充
            if (c <= d) {
                for (int i = d; i >= c; --i) {
                    arr[i][a] = num++;
                }
                ++a;
            }
        }
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                printf("%d ", arr[i][j]);
            }
            printf("\n");
        }
        return 0;
    }

...全文
91 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

342

社区成员

发帖
与我相关
我的任务
社区描述
一个供Leaders学习交流的地方
c++javapython 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • 叫我胡萝北
  • CheungZzzc
  • szu_gexu
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧