private void mn(int m, int n) {
if(m < n)
throw new IllegalArgumentException("Error m < n");
int[] array = new int[m];
for(int i = 0; i < m; i ++)
array[i] = i + 1;
BitSet bs = new BitSet(m);
for(int i = 0; i < n; i++)
bs.set(i, true);
do {
printAll(array, bs);
}while(moveNext(bs, m));
}
private boolean moveNext(BitSet bs, int m) {
int start = -1;
while(start < m)
if(bs.get(++start))
break;
if(start >= m)
return false;
int end = start;
while(end < m)
if(!bs.get(++end))
break;
if(end >= m)
return false;
for(int i = start; i < end; i++)
bs.set(i, false);
for(int i = 0; i < end - start - 1; i++)
bs.set(i);
bs.set(end);
return true;
}
private void printAll(int[] array, BitSet bs) {
StringBuffer sb = new StringBuffer();
for(int i = 0; i < array.length; i++)
if(bs.get(i))
sb.append(array[i]).append(',');
sb.setLength(sb.length() - 1);
System.out.println(sb);
}
public static void main(String[] args) throws Exception {
new TestA().mn(8, 3);
}