-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathA23.js
More file actions
52 lines (40 loc) · 1.39 KB
/
A23.js
File metadata and controls
52 lines (40 loc) · 1.39 KB
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
const fs = require('fs');
// 標準入力からの読み取り
const input = fs.readFileSync('/dev/stdin', 'utf8');
function main(input) {
const lines = input.trim().split('\n');
const [N, M] = lines[0].split(' ').map(Number);
const A = lines.slice(1).map((line) => line.split(' ').map(Number));
// クーポンごとの品物カバービットマスクを作成
const masks = A.map((row) => {
let mask = 0;
for (let i = 0; i < N; i++) {
if (row[i] === 1) {
mask |= 1 << i;
}
}
return mask;
});
const goal = (1 << N) - 1; // すべての品物を取得した状態
const visited = new Array(1 << N).fill(false);
const queue = [];
queue.push({ state: 0, count: 0 });
visited[0] = true;
while (queue.length > 0) {
const { state, count } = queue.shift();
for (let i = 0; i < M; i++) {
const nextState = state | masks[i];
if (nextState === goal) {
console.log(count + 1); // 最短で全品目が揃った!
return;
}
if (!visited[nextState]) {
visited[nextState] = true;
queue.push({ state: nextState, count: count + 1 });
}
}
}
// 最後までたどり着けなかった(全品目揃わない)
console.log(-1);
}
main(input);