先初始化,然后从后往前遍历,遇到 ‘1’ 时,记下其下标f1,然后从f1-1的下标开始继续往前遍历,直到遇到第一个 ‘0’ ,记下其下标 f2,交换f1 与 f2对应的元素,然后将f2以后的元素按增序排列。循环直到,所有的 ‘1’在所有的‘0’前面时,即:f2 == -1时,结束。
注意:是两组元素之间有一个空行,而非每组元素后都有空行,因为这个地方WA了一次,竟然又在这种破地方栽了,哎,太不仔细了 ~~
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a,const void *b)
{
return *(char*)a - *(char*)b;
}
int main()
{
char a[18];
int h, n, num, i;
scanf("%d",&num);
while(num--)
{
scanf("%d%d",&n,&h);
memset(a,0,sizeof(a));
for(i = 0; i < n-h; i++) //初始化字符串
a[i] = '0';
for(; i< n; i++)
a[i] = '1';
puts(a);
while(1)
{
int ii;
for(i = n-1; i >= 0; i--) // 找 f1
if(a[i] == '1')
break;
for(ii = i - 1; ii >= 0; ii--) // 找 f2
if(a[ii] == '0')
break;
if(ii == -1)
break;
char t = a[i];
a[i] = a[ii];
a[ii] = t;
if(n - ii -1)
qsort(&a[ii + 1], n - ii - 1, sizeof(a[0]), cmp); // f2 之后元素排序
puts(a);
}
if(num)
puts("");
}
return 0;
}