http://acm.hdu.edu.cn/showproblem.php?pid=1716
排列2
Time Limit: 1000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1948????Accepted Submission(s): 757
Problem Description
Ray又對數字的列產生了興趣:
現有四張卡片,用這四張卡片能排列出很多不同的4位數,要求按從小到大的順序輸出這些4位數。
現有四張卡片,用這四張卡片能排列出很多不同的4位數,要求按從小到大的順序輸出這些4位數。
?
?
Input
每組數據占一行,代表四張卡片上的數字(0<=數字<=9),如果四張卡片都是0,則輸入結束。
?
?
Output
對每組卡片按從小到大的順序輸出所有能由這四張卡片組成的4位數,千位數字相同的在同一行,同一行中每個四位數間用空格分隔。
每組輸出數據間空一行,最后一組數據后面沒有空行。
每組輸出數據間空一行,最后一組數據后面沒有空行。
?
?
Sample Input
1 2 3 4
1 1 2 3
0 1 2 3
0 0 0 0
?
Sample Output
1234 1243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321
?
1123 1132 1213 1231 1312 1321
2113 2131 2311
3112 3121 3211
?
1023 1032 1203 1230 1302 1320
2013 2031 2103 2130 2301 2310
3012 3021 3102 3120 3201 3210
?
題目的目的是輸出數字的全排列,看似很簡單,但是這題讓我糾結了好長時間~~
首先輸出前排列時不能讓千位為0,然后要將相同的數字排除掉,比如:1 1 2 3時 1123和1123一樣~~然后就是輸出格式,換行問題。
剛開始我想用一個計數的變量,6個數字換一行,但是第二個樣例不符合,也就是當有相同數字時,每一行不一定是6個;后來我加了一個變量,每次輸出時判斷首位是否和上次輸出相同,相同則輸出空格,不同輸出換行~~(注意每行結尾不能先輸空格再換行,會PE~~~)最后還要注意輸入的兩組數據之間要空一行,但是最后一組數據不能有空行~~~
各種PE,郁悶死了....
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 int c[ 4 ], s[ 4 ], flag, begin;
6 int cmp( const void *a, const void *b)
7 {
8 return *( int *)a - *( int *)b;
9 }
10 void get_next( int cur, int n)
11 {
12 if (cur == n)
13 {
14 if (s[ 0 ] == 0 )
15 return ;
16 if (flag != s[ 0 ])
17 {
18 flag = s[ 0 ];
19 putchar( 10 );
20 }
21 else if (begin)
22 begin = 0 ;
23 else if (!begin)
24 putchar( ' ' );
25 for ( int i = 0 ; i < 4 ; i++)
26 {
27 printf( " %d " , s[i]);
28 }
29 return ;
30 }
31 for ( int i = 0 ; i < 4 ; i++)
32 if (!i || c[i] != c[i- 1 ])
33 {
34 int c1, c2;
35 c1 = c2 = 0 ;
36 for ( int j = 0 ; j < cur; j++)
37 if (s[j] == c[i])
38 c1++;
39 for (j = 0 ; j < n; j++)
40 if (c[i] == c[j])
41 c2++;
42 if (c1 < c2)
43 {
44 s[cur] = c[i];
45 get_next(cur+ 1 , n);
46 }
47 }
48 }
49 int main()
50 {
51 scanf( " %d%d%d%d " , &c[ 0 ], &c[ 1 ], &c[ 2 ], &c[ 3 ]);
52 if (c[ 1 ] || c[ 2 ] || c[ 3 ] || c[ 0 ])
53 {
54 qsort(c, 4 , sizeof ( int ), cmp);
55 for ( int i = 0 ; c[i] == 0 ; i++);
56 flag = c[i];
57 begin = 1 ;
58 get_next( 0 , 4 );
59 putchar( 10 );
60 }
61 else return 0 ;
62 while (scanf( " %d%d%d%d " , &c[ 0 ], &c[ 1 ], &c[ 2 ], &c[ 3 ]))
63 {
64 if (c[ 1 ] || c[ 2 ] || c[ 3 ] || c[ 0 ])
65 {
66 putchar( 10 );
67 qsort(c, 4 , sizeof ( int ), cmp);
68 for ( int i = 0 ; c[i] == 0 ; i++);
69 flag = c[i];
70 begin = 1 ;
71 get_next( 0 , 4 );
72 putchar( 10 );
73 }
74 else break ;
75 }
76 return 0 ;
77 }
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
