【杭电】[1716]排列2
一个输出排列组合结果的题目
起初忘了C++里的函数……
所以硬写的
#include<stdio.h>
#include<algorithm>
using namespace std;
int x[10000];
int main() {
int a[4];
bool kaseflag=false;
while(scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3]),a[0]||a[1]||a[2]||a[3]) {
if(kaseflag)
printf("\n");
sort(a,a+4);
for(int i=0; i<4; i++) {
bool flag=false;
int ti=a[i];
for(int j=0; j<4; j++) {
if(j!=i) {
int tj=ti*10+a[j];
for(int k=0; k<4; k++) {
if(k!=i&&k!=j) {
int tk=tj*10+a[k];
for(int p=0; p<4; p++) {
if(p!=i&&p!=j&&p!=k) {
int tp=tk*10+a[p];
if(tp<1000)
continue;
if(!x[tp]) {
x[tp]=1;
if(flag)
printf(" %d",tp);
else
printf("%d",tp);
flag=true;
}
}
}
}
}
}
}
if(flag)
printf("\n");
}
kaseflag=true;
}
return 0;
}
然后又写了一个C++
next_permutation
的版本
需要注意的是用这个函数时要保证初始数组已经是从小到大的
(这一题题目没说 不过测试数据应该都是已经排序过的)
#include<stdio.h>
#include<algorithm>
using namespace std;
int main() {
int a[4];
bool kaseflag=false;
while(scanf("%d%d%d%d",&a[0],&a[1],&a[2],&a[3]),a[0]||a[1]||a[2]||a[3]) {
sort(a,a+4);
//无意中发现 如果不排序会出BUG
//不排序错误数据
//3 6 8 4
//3 8 4 6
//……等等
if(kaseflag)
printf("\n");
int t;
bool flag=true;
do {
if(a[0]==0)
continue;
if(flag) {
printf("%d%d%d%d",a[0],a[1],a[2],a[3]);
flag=false;
} else if(t==a[0])
printf(" %d%d%d%d",a[0],a[1],a[2],a[3]);
else
printf("\n%d%d%d%d",a[0],a[1],a[2],a[3]);
t=a[0];
} while(next_permutation(a,a+4));
printf("\n");
kaseflag=true;
}
return 0;
}
题目地址:【杭电】[1716]排列2