小猴爬台阶问题:
有一只小猴很顽皮,喜欢爬台阶,但由于小猴太小,所以它只能一步爬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>()); } } }
原文地址:http://blog.csdn.net/three_man/article/details/36975925