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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

