C++递归——蛇形方阵

#题目描述#

———————————————————思考线—————————————————————

#思路分析#

其实这道题并没有想象中那么麻烦,我们只需要关注第一轮也就是最外圈是如何赋值的即可。

重难点:

1.每一个断点到底是应该哪一个循环赋值?

2.每一次换行第一个元素位置如何确定?

......

#递归模板#

void snake(int number,int i,int j,int length){

    if(length==0) return;
    
    else{
        ......
    }

    snake(number,i+1,j+1,length-2);
}

#具体思路分析#

#代码实现#

//蛇形打印
#include<iostream>
#include<iomanip>
using namespace std;
const int max_size = 10;
long long k[max_size][max_size] = {0};
void snake(int& num,long long fill[max_size][max_size],int i,int j,int length) {
    if(length<=0)return;
    if(length==1) {
        fill[i][j]=num;
    }
    for(int m = i;m<i+length-1;m++) {
        if(fill[m][j]==0) {
            fill[m][j] = num;
            num++;
        }
    }
    for(int n = j;n<j+length-1;n++) {
        if(fill[j+length-1][n]==0) {
            fill[j+length-1][n]=num;
            num++;
        }
    }
    for(int s = i+length-1;s>=i;s--) {
        if(fill[s][i+length-1]==0) {
            fill[s][i+length-1] = num;
            num++;
        }
    }
    for(int t= j+length-1;t>j;t--) {
        if(fill[i][t]==0) {
            fill[i][t] = num;
            num++;
        }
    }
    snake(num,fill,i+1,j+1,length-2);
}
int main() {
    int num,i,j,size;
    cin>>num>>i>>j>>size;
    snake(num,k,i,j,size);
    for(int a = 1;a<=size;a++) {
        for(int b = 1;b<=size;b++) {
            cout<<setw(5)<<k[a][b];
        }
        cout<<endl;
    }
    return 0;
}

#打印结果#

#学习指南#

1.首先分析这道题的逻辑框架:只需要考虑四个部分:左部,下部,右部,上部是如何进行循环赋值的。

2.处理好边界条件:断点是要着重处理的,一定要具体分析这个数应该在哪个循环中进行赋值?下一个数应该安置在那个具体的位置上?弄不清楚可以代数来做。

3.明确循环边界条件:一定不能出现数组溢出的情况,否则对于初学者很难找到具体错误的位置。

4.尝试使用debug:程序员必备,但是要尽量自己想明白再让机器实践。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值