首页 > 编程语言 >C++递归——蛇形方阵

C++递归——蛇形方阵

时间:2024-09-16 16:49:01浏览次数:3  
标签:递归 int snake C++ length num 蛇形 fill size

#题目描述#

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

#思路分析#

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

重难点:

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:程序员必备,但是要尽量自己想明白再让机器实践。

标签:递归,int,snake,C++,length,num,蛇形,fill,size
From: https://blog.csdn.net/2301_80309996/article/details/142304114

相关文章

  • C++速通LeetCode简单第17题-爬楼梯
    思路要点:将问题转化为求斐波那契数列的第n项,然后迭代。思路分析:最后一次爬的阶数不是1就是2,假设爬n阶的方法数是f(n),假设最后一次爬1阶,那么爬前面的n-1阶的方法数是f(n-1);假设最后一次爬2阶,那么爬前面n-1阶的方法数是f(n-2)。所以可以得到:f(n)=f(n-1)+f(n-2),也就是斐波......
  • 【C++】模板进阶:深入解析模板特化
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与Queue本章将......
  • 【C++】queue和priority_queue
    个人主页~queue和priority_queue一、queue的介绍和使用1、queue的介绍2、queue的使用3、queue的模拟实现二、priority_queue的介绍和使用1、priority_queue的介绍2、priority_queue的使用3、priority_queue的模拟实现三、仿函数1、仿函数的特征2、仿函数的使用ex、......
  • 用chatgpt让自己练习C++匿名函数
    再也不用去搜罗题目了,chatgpt1分钟搞定!如何使用ChatGPT帮助自己学习1、写prompt帮我写一个prompt,让LLM出一个c++专项训练的题目和题解,比如用户想学习C++的匿名函数,LLM就生成一个小型题目,题解全部是用C++匿名函数实现的。chatgpt:当然可以!以下是一个为训练C++匿名函......
  • C++ 成员函数指针简单测试
    classDog{public:voidUpdate_Func(shorti);short(Dog::*pfunc)(short);std::function<short(short)>ffunc;public:shortgoodMorning(shortid);shortgoodAfternoon(shortid);};voidDog::Update_Func(shorti){switch(i)......
  • 【GESP】C++一级练习BCQM3005,基本输出语句printf
    一道基础练习题,练习基本输出语句printf。BCQM3005题目要求描述输出表达式1234∗5678的结果。输入无输出1234∗5678=7006652输入样例无输出样例1234*5678=7006652全文详见个人独立博客:https://www.coderli.com/gesp-1-bcqm3005/【GESP】C++一级练习B......
  • C++数据结构-二叉树的三种遍历方法(进阶篇)
    1.遍历简介:树作为非线性数据结构,在我们取出数据时就需要设计遍历,所谓遍历,就是按照一定的规则性,将数据结构中的所有数据全部依次访问,而二叉树本身并不具有天然的全局次序,故为实现遍历,需通过在各节点与其孩子之间约定某种局部次序,间接地定义某种全局次序,这便是我们常规定的先序......
  • C++数据结构-二叉树的存储方法(基础篇)
    1.简介根据前文的介绍,我们知道了二叉树的性值,其就是一种每一个结点中只允许拥有左右孩子(或为空)的树,这种数据结构在我们的实际设计中非常常用,如前文提到的STL中的set集合,其底层就是一颗标准的红黑树(二叉树的一种),我们这里以创建一颗二叉树并实现通过特定的插入顺序和读取顺序达......
  • C++ 左值和右值
    一般而言,一个左值表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值。我们不能将其绑定到要求转换的表达式、字面常量或是返回右值的表达式(参见2.3.1节,第46页)。右值引用有着完全相反的绑定特性:我们可以将一个右值引用绑定到这类表达式上,但不能将一个右值引用......
  • C++-练习-40
    题目:编写一个程序,她每次读取一个单词,知道用户只输入q。然后,该程序指出有多少个单词以元音大头,而多少个单词以辅音大头,还有多少个单词不属于着两类。源代码:#include<iostream>#include<cctype>//元音:A、E、I、O、Uintmain(){ usingnamespacestd; charword[20];......