HDU 1176 排列2 全排列

解题报告:给出四个数,然后要你把这四个数组合成的各不相同的四位数按照从小到大的顺序输出来,然后如果最高位是0的话不能输出来,还有最高位是数字如果一样的话,则放在同一行输出。

本来是个比较简单的生成全排列的题,并且个数都固定了,但是这题的特点就是输入的四个数中,并不是各不相同的四个数,所以我们在得到结果之后就必须要判断这个结果在以前是不是已经出现过,然后还有一个就是最高位相同的输出时要放在同一行。然后就是输出每一行之后都要有一个空行,但是最后一组数据后面不能有空行。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int visit[20],n,B[5],map[30][5],num;
 8 
 9 void dfs(int *A,int deep) {
10     if(deep == 5) {
11         ++num;
12         for(int i = 1;i<=4;++i)
13         map[num][i] = A[i];
14     }
15     else for(int i = 1;i<=4;++i)
16     if(!visit[i]) {
17         visit[i] = 1;
18         A[deep] = B[i];
19         dfs(A,deep+1);
20         visit[i] = 0;
21     }
22 }
23 int judge(int *A,int n) { //判断是否出现过 
24     if(A[1] == 0)
25     return 1;
26     for(int i = 1;i<n;++i)
27     if(map[i][1]==A[1]&&map[i][2]==A[2]&&map[i][3]==A[3]&&map[i][4]==A[4])
28     return 1;
29     return 0;
30 }
31 int main() {
32     int A[5];
33     bool f1 = 0;
34     while(scanf("%d%d%d%d",&B[1],&B[2],&B[3],&B[4]),B[1]+B[2]+B[3]+B[4]) {
35         sort(B+1,B+5);
36         memset(visit,0,sizeof(visit));
37         memset(map,0,sizeof(map));
38         num = 0;
39         dfs(A,1);   //先将所有的24种可能存到一个数组里面 
40         int f = 1;
41         if(f1)  //保证最后一组数据后面没有空行,前面的数据后有空行 
42         puts("");
43         for(int i = 1;i<=4;++i) {
44             int flag = 1;
45             for(int j = 1;j<=6;++j) {
46                 if(judge(map[f],f));
47                 else { printf(flag? "%d%d%d%d":" %d%d%d%d",map[f][1],map[f][2],map[f][3],map[f][4]); flag = 0;}
48                 f++;
49             }
50             if(!flag)
51             puts("");
52         }
53         f1 = 1;
54     }
55     return 0;
56 }
View Code
原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3256176.html