用next_permutation()没什么困难的,困难的是对于输出格式有要求。
1每一行中间空格,每一个样例中间空行(意味着每一行最好不需要加空格,每一个样例最后不需要加行)对于这种中间空行空格的输出格式,我设置flag判断是否是第一个,第一个“%d",后面都是” %d"。这样每一个输出不会影响下一个输出。中间加行同上(注意第一个为“%d\n",后面为”%d\n\n" 至少有一个换行符。
2中间换行判断,使用i记录当前行首,一旦行首换了就换行”\n%d" (注意有0的情况被跳过,i应该在输出的第一个值中被赋值,而不是为最初的a[0]。)
3总之,把输出的第一个设置为特例,使得每一次输入不影响下一次,是我习惯的输出控制方法。
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
int a[4], fir = 0;
while(scanf("%d%d%d%d", &a[0], &a[1], &a[2], &a[3])){
if((a[0]||a[1]||a[2]||a[3]) == 0) break;
if(fir) printf("\n");
else fir = 1;
sort(a, a+4);
int i, j = a[3], flag = 0;
do{
if(a[0] == 0)continue;
if(flag == 0){
printf("%d%d%d%d", a[0], a[1],a[2],a[3]);
flag = 1;
i = a[0];
continue;
}
if(i!=a[0] && i!=j){
i = a[0];
printf("\n%d%d%d%d", a[0],a[1],a[2],a[3]);
continue;
}
printf(" %d%d%d%d", a[0], a[1],a[2],a[3]);
}while(next_permutation(a, a+4));
printf("\n");
}
return 0;
}