【杭电】[1716]排列2

文章字数:372

问题描述

问题分析

一个输出排列组合结果的题目
起初忘了C++里的函数……
所以硬写的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#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
的版本

需要注意的是用这个函数时要保证初始数组已经是从小到大的
(这一题题目没说 不过测试数据应该都是已经排序过的)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#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

该内容采用 CC BY-NC-SA 4.0 许可协议。

如果对您有帮助或存在意见建议,欢迎在下方评论交流。

加载中...