九层妖塔

涛哥分析的好有道理


下一期涛哥应该要带来猜奥秘的模型了吧!

以下代码待验证。

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
78
79
80
81
82
83
84
85
#include <vector>
using namespace std;
class tree {
public:
void (int dragon, int damage) {
vector<int> in;
in.push_back (30);
for (int i = 1; i < dragon + 1; i++) {
in.push_back (2);
}
build_tree_1 (in, damage, 1.0);
}
bool result_match (vector<int> &in) {
int cnt = 0;
for (int i = 1; i < in.size (); i++)
if (in[i] != 0)
cnt++;
return cnt == alive;
}
void build_tree_1 (vector<int> &in, int damage, float p) {
int count = 0;
float new_p = 0.0;
#ifdef DEBUG
for (int i = 0; i < in.size (); i++)
cout << in[i] << ",";
cout << "Prob " << p << " else damage " << damage << endl;
#endif
if (damage == 0) {
if (result_match (in))
result += p;
return;
}
for (int i = 0; i < in.size (); i++) {
if (in[i] != 0)
count++;
}
if (count == 0)
return;
new_p = p / count;
count = 0;
for (int i = 0; i < in.size (); i++) {
if (in[i] == 0)
continue;
in[i]--;
build_tree_1 (in, damage - 1, new_p);
in[i]++;
}
}
tree (int dragon, int damage, int _alive) : alive (_alive) {
result = 0.0;
build_tree (dragon, damage);
}
float get_result () {
return result;
}
~tree () {
}
private:
int alive;
float result;
};
int main ()
{
tree t (3, 8, 1);
cout << t.get_result () << endl;
return 0;
}