package od0109;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
/**
* 楼梯总共N阶,小明可以一次可以跨1步,2步,3步,请用递归求出小明总共有多少种跨法走完这个楼梯。 具体走法
*
* @author Administrator
*
*/
public class Step {
public static void main(String[] args) {
Step step = new Step();
step.getSum(3);
step.f();
}
// 楼梯总数为N阶
//int starisNum = 5;
// 总共有1步,2步,3步这几种跨法
int[] ways = { 1, 2, 3 };
// 统计总共有多少种跨法
int count = 0;
// 记录每次的具体步数
ArrayList<Integer> list = new ArrayList<Integer>();
Set<ArrayList<Integer>> set = new TreeSet<ArrayList<Integer>>();
List<ArrayList<Integer>> list3 = new ArrayList<ArrayList<Integer>>();
List<ArrayList<Integer>> list4 = new ArrayList<ArrayList<Integer>>();
int tempSteps = 0;
/**
* 回溯法
*
* @param tempSteps
* : 暂时走到第几个台阶了
*/
void getSum(int starisNum) {
if (tempSteps > starisNum)
return;
// 达到要求了,计数加一,并输出具体的步数
if (tempSteps == starisNum) {
ArrayList<Integer> list2 = new ArrayList<Integer>();
count++;
System.out.println(count + " 具体步法为:" + list);
list2.addAll(list);
Collections.sort(list2);
list4.add(list2);
if(list3.isEmpty()){
list3.add(list2);
}else{
int flag = 0;
for(int i = 0; i < list3.size(); i++ ){
if(list3.get(i).size()== list2.size()){
int gg = 0;
for(int j = 0; j < list3.get(i).size();j++){
if(!list3.get(i).get(j).equals(list2.get(j))){
gg = 1;
break;
}
}
if(gg == 0){
flag = 1;
break;
}
}
}
if(flag==0){
list3.add(list2);
}
}
// set.add(list2);
System.out.println( "排序后为:" + list2);
return;
}
// 到达一个状态时,都先尝试走下所有的分支可能,然后再依次回退,这样就可以回溯遍历所有的可能了
for (int i = 0; i < ways.length; i++) {
list.add(ways[i]);
tempSteps = tempSteps + ways[i];
getSum(starisNum);// 加way 的第二步骤
tempSteps = tempSteps - ways[i];
list.remove(list.size() - 1);
}
}
void f(){
System.out.println( "list4:" + list4);
System.out.println( "list3:" + list3);
System.out.println( "list3 lengh:" + list3.size());
}
}