组合算法:
这里说的组合仅仅就是从1到N的N个数中选M个数的所有组合情况(N>=M),输出格式按照数字的递增顺序输出。
一般的代码实现都是利用递归的思想,或者更具体说,是使用深度优先搜索思想来解决,写法也比较简洁明了。
今天就来用非递归的方式,解决一下这个经典问题。直接上代码:
import java.util.Scanner;
import java.util.Stack;
public class DepthFirst {
private static void printstack(Stack<Integer> stack) {
if (stack == null) {
return;
}
for (int i = 0; i < stack.size(); i++) {
System.out.print(stack.get(i));
if (i < stack.size() - 1) {
System.out.print(" ");
}
}
System.out.println();
}
private static void DFS(int n, int m) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
while (!stack.empty()) {
if (stack.size() == m) {
printstack(stack);
int topVar = stack.peek();
if (topVar + 1 <= n) {
stack.pop();
stack.push(topVar + 1);
} else {
stack.pop();
if (stack.empty()) {
return;
}
int sectopVar = stack.pop();
stack.push(sectopVar + 1);
}
} else {
int topVar = stack.peek();
if (topVar + 1 <= n) {
stack.push(topVar + 1);
} else {
stack.pop();
if (stack.empty()) {
return;
}
int sectopVar = stack.pop();
stack.push(sectopVar + 1);
}
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
int m = scanner.nextInt();
DFS(n, m);
}
}
}