回答編集履歴

2

Javaコードを追記

2022/06/25 00:11

投稿

xebme
xebme

スコア1083

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

解説を追記

2022/06/20 10:57

投稿

xebme
xebme

スコア1083

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
+