递归与排列组合问题
递归与排列组合问题
1.OnlineJ240:图形打印
Tags:递归
当 n 为 1 时,图形如下图:
1 | X |
当 n 为 2 时,图形如下图:
1 | X X |
当 n ≥ 2 时,图形规律如下:
1 | 图形n-1 图形n-1 |
给定 n 组数据,输出每组数据对应的图形。
输入:
输入共 n+1 行,前 n 行每行一个数,表示要输出的图形的大小,最后一行输入 −1 代表程序结束。(1 ≤ n ≤ 7)
输出:
每输入一个数输出一组图形,并在图形后的下一行输出一个 −。
注意,图形后应补齐空格。
1 | 1 |
1 | X |
参考代码
==思路==:递归函数的定义以 (x, y)
点为左上角画n大小的图形
- n = 1时,num[1] = 1
- n = 2时,num[2] = 3
- n = 3时,num[3] = 9…
- n = n时,num[3] = (n - 1) * 3
假设画最大的图形:func(1, 1, 7)可以递归为画以下图形:
- 左上角
func(1, 1, 6)
- 右上角
func(x, y + num[n]/3*2, 6)
- 左下角
func(x + num[n]/3*2, y, 6)
- 右下角
func(x + num[n]/3*2, y + num[n]/3*2, 6)
- 中间部分
func(x + num[n]/3*1, y + num[n]/3*1, 6)
1 |
|
2.OnlineJ235:指数型枚举
从 1 − n 这 n 个整数中随机选取任意多个,每种方案里的数从小到大排列,按字典序输出所有可能的选择方案。
输入:
输入一个整数 n。(1 ≤ n ≤ 10)
输出:
每行一组方案,每组方案中两个数之间用空格分隔。
注意每行最后一个数后没有空格。
1 | 3 |
1 | 1 |
1 | 4 |
1 | 1 |
参考代码
==思路==:
- 第一层可选:1 ~ n
- 第二层可选:2 ~ n || 3 ~ n || 4 ~ n || … || n-1 ~ n
- 上一层选的几,这一层就需要从几开始,这样才能避免重复、并保证后面选出的数字肯定要比之前选的更大
1 |
|
3.OnlineJ236:组合型枚举
从 1 − n 这 n 个整数中随机选取 m 个,每种方案里的数从小到大排列,按字典序输出所有可能的选择方案。
输入:
输入两个整数 n,m。(1 ≤ m ≤ n ≤ 10)
输出:
每行一组方案,每组方案中两个数之间用空格分隔。
注意每行最后一个数后没有空格。
1 | 3 2 |
1 | 1 2 |
1 | 5 3 |
1 | 1 2 3 |
参考代码
1 |
4.OnlineJ237:排列型枚举
从 1 − n 这 n 个整数排成一排并打乱次序,按字典序输出所有可能的选择方案。
输入:
输入一个整数 n。(1 ≤ n ≤ 8)
输出:
每行一组方案,每组方案中两个数之间用空格分隔。
注意每行最后一个数后没有空格。
1 | 3 |
1 | 1 2 3 |
参考代码
1 |
5.排列组合问题总结:
6.搜索讲解:
7.搜索走地图问题:
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.