#题目描述#
———————————————————思考线—————————————————————
#思路分析#
其实这道题并没有想象中那么麻烦,我们只需要关注第一轮也就是最外圈是如何赋值的即可。
重难点:
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