A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。 要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。 请填写出所有符合要求的排列中,字典序最小的那个。例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
//我当时没想明白,先把题目贴出来供C语言组对分
解题思路
由于只要答案,效率上就不用过多考虑,我使用1, 2, 3, 4 来代替 '2', '3', '4', 'A', 计算完成后再转换过来就行,答案应该是2342A3A4.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
#include <iostream>
#include <sstream>
// 55443322 ~ 22334455
// 2342A3A4
int
getPosReverse(std::string& str,
int
num) {
num +=
'0'
;
for
(
int
i(str.size()); i != -1; --i) {
if
(str[i] == num)
return
i;
}
}
int
getPos(std::string& str,
int
num) {
num +=
'0'
;
for
(unsigned i(0); i != str.size(); ++i) {
if
(str[i] == num)
return
i;
}
}
bool
check(unsigned i) {
std::stringstream ss;
std::string str;
ss << i;
ss >> str;
int
index;
int
nums[4] = {0, 0, 0, 0};
for
(unsigned i(0); i != str.size(); ++i) {
switch
(str[i] -
'1'
) {
case
0: ++nums[0];
break
;
case
1: ++nums[1];
break
;
case
2: ++nums[2];
break
;
case
3: ++nums[3];
break
;
default
:
return
false
;
}
}
for
(unsigned i(0); i != 4; ++i) {
if
(nums[i] != 2)
return
false
;
}
if
(getPosReverse(str, 4) - getPos(str, 4) != 2)
return
false
;
if
(getPosReverse(str, 1) - getPos(str, 1) != 3)
return
false
;
if
(getPosReverse(str, 2) - getPos(str, 2) != 4)
return
false
;
if
(getPosReverse(str, 3) - getPos(str, 3) != 5)
return
false
;
return
true
;
}
int
main() {
check(11223344);
for
(unsigned i(11223344); i != 44332211; ++i) {
if
(check(i)) {
std::cout << i << std::endl;
}
}
return
0;
}
|