/
/
标记
39
层,每层选取的元素是谁
unsigned
int
id02[
39
]
=
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
};
/
/
判断差值是否合规
1
=
合规
0
=
错误
int
judge(
int
value)
{
int
precision
=
9
;
if
((value <
0
) && (
0
-
value > precision))
return
0
;
if
((value >
0
) && (value > precision))
return
0
;
return
1
;
}
/
/
depth表示当前层级,一共遍历
39
层
void search02(unsigned
int
*
arr,
int
depth,
int
qian,
int
bai,
int
shi,
int
ge)
{
if
(depth
=
=
39
)
{
if
(qian
=
=
0
&& bai
=
=
0
&& shi
=
=
0
&& ge
=
=
0
)
{
unsigned
int
final39[
39
]
=
{
0
};
for
(
int
i
=
0
; i <
39
; i
+
+
)
final39[i]
=
*
(arr
+
2
*
i
+
id02[i]);
/
/
获取当前数值
Bubble_sort(final39,
39
);
/
/
对final39数组排序
/
/
构造
156
位字符串,计算md5
unsigned char
*
input
=
(unsigned char
*
)malloc(
4
*
39
+
1
);
memset(
input
,
'0'
,
4
*
39
);
input
[
4
*
39
]
=
0
;
for
(
int
i
=
0
; i <
39
; i
+
+
)
{
int
value
=
final39[i];
/
/
从对元素中取一个
int
bit0
=
value
/
1000
;
/
/
千位 第一行
int
bit1
=
value
%
1000
/
100
;
/
/
百位 第二行
int
bit2
=
value
%
100
/
10
;
/
/
int
bit3
=
value
%
10
;
input
[i]
=
bit0
+
'0'
;
input
[i
+
39
]
=
bit1
+
'0'
;
input
[i
+
39
*
2
]
=
bit2
+
'0'
;
input
[i
+
39
*
3
]
=
bit3
+
'0'
;
}
char
*
res
=
getMd5(
input
);
if
(strcmp(res,
"aac82b7ad77ab00dcef90ac079c9490d"
)
=
=
0
)
{
printf(
"%s\n"
,
input
);
printf(
"%s\n"
, res);
free(
input
);
free(res);
exit(
0
);
}
free(
input
);
free(res);
}
}
for
(
int
i
=
0
; i <
2
; i
+
+
)
{
int
value
=
*
(arr
+
2
*
depth
+
i);
/
/
从对元素中取一个
int
bit0
=
value
/
1000
;
/
/
千位 第一行
int
bit1
=
value
%
1000
/
100
;
/
/
百位 第二行
int
bit2
=
value
%
100
/
10
;
/
/
int
bit3
=
value
%
10
;
if
(bit0
=
=
2
) bit0
=
-
1
;
if
(bit1
=
=
2
) bit1
=
-
1
;
if
(bit2
=
=
2
) bit2
=
-
1
;
if
(bit3
=
=
2
) bit3
=
-
1
;
if
(judge(qian
+
bit0) && judge(bai
+
bit1) && judge(shi
+
bit2) && judge(ge
+
bit3))
{
id02[depth]
=
i;
search02(arr, depth
+
1
, qian
+
bit0, bai
+
bit1, shi
+
bit2, ge
+
bit3);
id02[depth]
=
-
1
;
}
}
return
;
}
void ctf02()
{
/
/
准备对立数组
unsigned
int
arr[
39
][
2
]
=
{
{
1
,
2
},{
10
,
20
},{
11
,
22
},{
12
,
21
},{
100
,
200
},{
101
,
202
},{
102
,
201
},{
110
,
220
},{
111
,
222
},{
112
,
221
},
{
120
,
210
},{
121
,
212
},{
122
,
211
},{
1000
,
2000
},{
1001
,
2002
},{
1002
,
2001
},{
1010
,
2020
},{
1011
,
2022
},{
1012
,
2021
},{
1020
,
2010
},
{
1021
,
2012
},{
1022
,
2011
},{
1100
,
2200
},{
1101
,
2202
},{
1102
,
2201
},{
1110
,
2220
},{
1112
,
2221
},{
1120
,
2210
},{
1121
,
2212
},{
1122
,
2211
},
{
1200
,
2100
},{
1201
,
2102
},{
1202
,
2101
},{
1210
,
2120
},{
1211
,
2122
},{
1212
,
2121
},{
1220
,
2110
},{
1221
,
2112
},{
1222
,
2111
}
};
search02((unsigned
int
*
)arr,
0
,
0
,
0
,
0
,
0
);
}