小猴爬台阶问题

小猴爬台阶问题:

有一仅仅小猴非常顽皮,喜欢爬台阶,但因为小猴太小,所以它仅仅能一步爬1个或2个台阶。请计算该小猴全部可能的爬行路径。

package shuai.study.steps;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * @author shengshu
 *
 */
public class MonkeyCrawl {

	// Get paths, which will be permutated
	public static Set<String> getPathsSet(int steps) {
		Set<String> pathsSet = new HashSet<String>();

		for (int i = 0; i <= steps / 2; i++) {
			int twoStepSum = i * 2;
			int oneStepTimes = steps - twoStepSum;

			StringBuffer pathStringBuffer = new StringBuffer();

			for (int x = 0; x < oneStepTimes; x++) {
				// "-" represent one step
				pathStringBuffer.append("-");
			}

			for (int y = 0; y < i; y++) {
				// "=" represent two steps
				pathStringBuffer.append("=");
			}

			pathsSet.add(pathStringBuffer.toString());
		}

		return pathsSet;
	}

	// Permutate all possible paths
	public static void permutatePaths(String path, List<String> list) {
		if (path.length() == 1) {
			for (int i = 0; i < list.size(); i++) {
				System.out.print(list.get(i));
			}

			System.out.println(path);
		} else {
			int index[] = new int[path.length()];

			for (int i = 0; i < index.length; i++) {
				index[i] = path.indexOf(path.charAt(i));
			}

			for (int i = 0; i < path.length(); i++) {
				String subPath = path.substring(1, path.length());

				if (i == index[i]) {
					list.add("" + path.charAt(0));

					permutatePaths(subPath, list);

					list.remove(list.size() - 1);
				}

				path = subPath + path.charAt(0);
			}
		}
	}

	public static void main(String[] args) {
		// Set steps as 15, or others
		Set<String> pathsSet = MonkeyCrawl.getPathsSet(15);

		Iterator<String> iterator = pathsSet.iterator();
		while (iterator.hasNext()) {
			String path = iterator.next();
			MonkeyCrawl.permutatePaths(path, new ArrayList<String>());
		}
	}

}
时间: 2024-11-12 05:58:12

小猴爬台阶问题的相关文章

洛谷——P1125 笨小猴

https://www.luogu.org/problem/show?pid=1125 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案. 输入输出格式 输入格式: 输入文件

bzoj1430 小猴打架

Description 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打架之后,整个森林的小猴都会成为好朋友. 现在的问题是,总共有多少种不同的打架过程. 比如当N=3时,就有{1-2,1-3}{1-2,2-3}{1-3,1-2}{1-3,2-3}{2-3,1-2}{2-3,1-3}六种不同的打架过程. Input 一个整数N. Output 一行,方案数mod 9999991. S

洛谷 P1125 笨小猴(NOIp2008提高组T1)

题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案. 输入输出格式 输入格式: 输入文件word.in只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100. 输出格

06:笨小猴

06:笨小猴 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案. 输入 只有一行,是一个单词,其中

[BZOJ1430] 小猴打架 (数学)

Description 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打架之后,整个森林的小猴都会成为好朋友. 现在的问题是,总共有多少种不同的打架过程. 比如当N=3时,就有{1-2,1-3}{1-2,2-3}{1-3,1-2}{1-3,2-3}{2-3,1-2}{2-3,1-3}六种不同的打架过程. Input 一个整数N. Output 一行,方案数mod 9999991. S

luogu P1125 笨小猴

题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案. 输入输出格式 输入格式: 输入文件word.in只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100. 输出格

bzoj 1430: 小猴打架

1430: 小猴打架 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 634  Solved: 461[Submit][Status][Discuss] Description 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打架之后,整个森林的小猴都会成为好朋友. 现在的问题是,总共有多少种不同的打架过程. 比如当N=3时,就有{1-2,

noip2008 笨小猴

P1125 笨小猴 1.6K通过 3.7K提交 题目提供者该用户不存在 标签模拟2008NOIp提高组 难度普及- 提交该题 讨论 题解 记录 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很

【prufer编码】BZOJ1430 小猴打架

Description 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打架之后,整个森林的小猴都会成为好朋友. 现在的问题是,总共有多少种不同的打架过程. 比如当N=3时,就有{1-2,1-3}{1-2,2-3}{1-3,1-2}{1-3,2-3}{2-3,1-2}{2-3,1-3}六种不同的打架过程. Solution 有一种神奇的prufer码,这种码和一棵树一一对应. 由树转码