递归输出数字三角形
【问题描述】
输出一个n行的与样例类似的数字三角形,必须使用递归来实现
【输入格式】
一个正整数数n,表示三角形的行数
【输出格式】
输出一个与样例类似的n行的数字三角形,同一行每两个数之间用一个空格隔开即可(图中只是为防止题面格式化而用’_'代替空格)
【样例输入】
4
【样例输出】
___1
__2_3
_4_5_6
7_8_9_10
【数据规模和约定】
n<=20
【解题思路】
看完题目顺着思路想可能会去思考如何通过n判断输出多少个空格?每一行应该输出多少个数字?此时就会想到,如果能先输出最后一行,那我就不用再数要输多少个空格了。这样就很容易能想到用递归做。
dfs的思想:一条路走到黑,直到走不了才会选择回头,然后重新选择一条路。
以n=4为例:
有阴影的格子是不需要输出空格的。
从最后一行开始,每走完一行step退后一步,再继续走。
#include <iostream>
using namespace std;
int n, cnt = 1;
void dfs(int x) {
if (x == 1) {
//dfs结束的标志
for (int i = 0; i < n - x; i ++ ) {
cout << " ";
}
cout << cnt ++ << endl;
return; //返回上一级的dfs函数
}
dfs(x - 1);
//这两个for循环即能输出一行
for (int i = 0; i < n - x; i ++ ) //输出前面的空格
cout<<" ";
for (int i = 0; i < x; i ++ ) //输出数,别忘了两个数之间用空格隔开
cout << cnt++ <<" ";
cout << endl; //回车进入下一行