螺旋填数问题

给一个m*n的数组,要求你进行螺旋填数,例如5 * 4
在这里插入图片描述
这个问题通过递归可以通过递归的方式来解决,填数的方式类似于这个样子
在这里插入图片描述
看懂了吗?
可以设置5个参数,rl 是该环中首行的序号,rh为该环中最后一行的行号,cl为该环中第一列的列号,cr为该环中最后一列的列号,num表示需要填入的第一个数。
每次进入下一层填数的时候,rl + 1, rh - 1, cl + 1, cr - 1。
递归基是rl > rh || cl > cr
递归条件里进行对每一环的填数,需要填上下两行,左右两列。可用四个for循环来实现
第一行中,行数都为rl,列数为cl到cr。
右边一列中,列数都为cr, 行数为rl + 1到rh。
最后一行中,行数为rh,列数为cr - 1 到cl。
第一列中,列数都为cl,行数为rh - 1到rl + 1。
代码实现如下:

//
//  main.cpp
//  spitial
//
//  Created by virgil wang on 2019/7/9.
//  Copyright © 2019 virgil wang. All rights reserved.
//

#include <iostream>
#include <cstdio>

using namespace std;
const int maxn = 1010;
int m, n;
int data[maxn][maxn];

void writenum(int rl, int rh, int cl, int cr, int num)
{
    if(rl > rh || cl > cr)
    {
        return;
    }else{
        for(int i = cl; i <= cr; i++)
        {
            data[rl][i] = num++;
        }
        for(int i = rl + 1; i <= rh; i++)
        {
            data[i][cr] = num++;
        }
        for(int i = cr - 1; i >= cl; i--)
        {
            data[rh][i] = num++;
        }
        for(int i = rh - 1; i >= rl + 1; i--)
        {
            data[i][cl] = num++;
        }
        writenum(rl + 1, rh - 1, cl + 1 , cr - 1, num);
    }
}

int main(int argc, char *argv[]) {
    scanf("%d%d", &m, &n);
    writenum(1, m, 1, n, 1);
    for(int i = 1; i <= m; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            printf("%d ", data[i][j]);
        }
        printf("\n");
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值