回答編集履歴
2
Javaコードを追記
test
CHANGED
@@ -31,3 +31,52 @@
|
|
31
31
|
|
32
32
|
[1]-[9]もそれぞれ9個に増える。以下同様。Nodeの数が増えてゆきます。expand()を7回実行すると求める順列が完成します。
|
33
33
|
|
34
|
+
**Javaコード(追記)**
|
35
|
+
|
36
|
+
```Java
|
37
|
+
import java.util.ArrayList;
|
38
|
+
import java.util.Set;
|
39
|
+
import java.util.stream.Collectors;
|
40
|
+
import java.util.stream.IntStream;
|
41
|
+
class Node {
|
42
|
+
int[] s = new int[7];
|
43
|
+
int p;
|
44
|
+
Node(int p) {
|
45
|
+
this.p = p;
|
46
|
+
}
|
47
|
+
protected Node(Node that, int x) {
|
48
|
+
this.s = that.s.clone();
|
49
|
+
this.p = that.p;
|
50
|
+
this.s[p++] = x;
|
51
|
+
}
|
52
|
+
boolean goalp() {
|
53
|
+
// if ((s[0] == 0) || (s[5] == 0)) return false;
|
54
|
+
int base = 1000 * s[0] + 100 * s[1] + 10 * s[2] + s[3];
|
55
|
+
int ball = 1000 * s[0] + 100 * s[1] + 10 * s[4] + s[4];
|
56
|
+
int games = 10000 * s[5] + 1000 * s[1] + 100 * s[6] + 10 * s[3] + s[2];
|
57
|
+
return (games == base + ball);
|
58
|
+
}
|
59
|
+
ArrayList<Node> expand() {
|
60
|
+
ArrayList<Node> al = new ArrayList<>();
|
61
|
+
// ここがわからない
|
62
|
+
boolean[] b = new boolean[10]; // 数字: 0 - 9 の除外対象
|
63
|
+
for (int i=0; i < p; ++i) {
|
64
|
+
b[s[i]] = true; // 既に数字s[i]が存在する。
|
65
|
+
}
|
66
|
+
if (p == 0 || p == 5) b[0] = true; // B != 0, G != 0
|
67
|
+
for (int i=0; i < b.length; ++i) { // 残りの数字を全て使う
|
68
|
+
if (!b[i]) al.add(new Node(this,i));
|
69
|
+
}
|
70
|
+
return al;
|
71
|
+
}
|
72
|
+
//B = 7, A = 4, S = 8, E = 3, L = 5, G = 1, M = 9
|
73
|
+
void show() {
|
74
|
+
System.out.println("B = " + s[0] + ", A = " + s[1] + ", S = " + s[2] + ", E = " + s[3] + ", L = " + s[4] + ", G = "
|
75
|
+
+ s[5] + ", M = " + s[6]);
|
76
|
+
}
|
77
|
+
// ArrayList<Node> expand() {
|
78
|
+
// Set<Integer> set = IntStream.of(s).limit(p).mapToObj(Integer::valueOf).collect(Collectors.toSet());
|
79
|
+
// return IntStream.range((p == 0 || p == 5) ? 1 : 0, 10).filter(x -> !set.contains(x)).mapToObj(x -> new Node(this, x)).collect(Collectors.toCollection(ArrayList::new));
|
80
|
+
// }
|
81
|
+
}
|
82
|
+
```
|
1
解説を追記
test
CHANGED
@@ -10,3 +10,24 @@
|
|
10
10
|
}
|
11
11
|
```
|
12
12
|
expand()のなかで配列sで使われていない数字を調べなければなりません。
|
13
|
+
|
14
|
+
|
15
|
+
**解説**
|
16
|
+
|
17
|
+
覆面算に使用する数字は7種類。expand()を使って0から9までの10個の数字から7個をとり並べる。
|
18
|
+
expand()1回分のルールは
|
19
|
+
|
20
|
+
- 配列sに含まれない数字を1つだけ末尾に追加したNodeを作成する
|
21
|
+
- 配列sに含まれない数字はもれなく使 って複数のNodeを作成する
|
22
|
+
- 作成したNodeはArrayListに追加する
|
23
|
+
|
24
|
+
配列sの初期値は空[]。expand()を実行すると0-9までの数字を末尾に追加した10個のNodeが作られる。
|
25
|
+
|
26
|
+
[0],[1],...,[9]
|
27
|
+
|
28
|
+
これらのNodeのれぞれにexpand()が適用される。例えばsが[0]のときexpand()するとNodeは9個に増える。
|
29
|
+
|
30
|
+
[01],[02],[03],[04],...,[09]
|
31
|
+
|
32
|
+
[1]-[9]もそれぞれ9個に増える。以下同様。Nodeの数が増えてゆきます。expand()を7回実行すると求める順列が完成します。
|
33
|
+
|