1
/**
2
* @param {number[][]} board
3
* @return {number}
4
*/
5
var movesToChessboard = function (board) {
6
const boardSize = board.length;
7
const boardSizeIsEven = boardSize % 2 === 0;
8

9
if (!canBeTransformed(board)) return -1;
10

11
// to convert to 010101
12
let rowSwap = 0;
13
let colSwap = 0;
14

15
// to convert to 101010
16
let rowSwap2 = 0;
17
let colSwap2 = 0;
18

19
for (let i = 0; i < boardSize; i++) {
20
if (board[i][0] === i % 2) {
21
rowSwap++;
22
} else {
23
rowSwap2++;
24
}
25
if (board[0][i] === i % 2) {
26
colSwap++;
27
} else {
28
colSwap2++;
29
}
30
}
31

32
// no need to swap anything
33
if (rowSwap + colSwap === 0 || rowSwap2 + colSwap2 === 0) return 0;
34

35
if (boardSizeIsEven) {
36
rowSwap = Math.min(rowSwap, rowSwap2);
37
colSwap = Math.min(colSwap, colSwap2);
38
} else {
39
rowSwap = rowSwap % 2 === 0 ? rowSwap : rowSwap2;
40
colSwap = colSwap % 2 === 0 ? colSwap : colSwap2;
41
}
42

43
return (rowSwap + colSwap) / 2;
44

45
function canBeTransformed(board) {
46
// number of 0 and 1 should be equal
47
let sum = board[0].reduce((a, b) => a + b);
48
if (boardSizeIsEven && sum != boardSize / 2) return false;
49
if (!boardSizeIsEven && sum > (boardSize + 1) / 2) return false;
50

51
let first = board[0].join("");
52
let opposite = board[0].map((item) => (item === 1 ? 0 : 1)).join("");
53
// each row should be equal to first or opposite
54
let counter = [0, 0];
55
for (let i = 0; i < boardSize; i++) {
56
let str = board[i].join("");
57
if (str == first) {
58
counter[0]++;
59
} else if (str == opposite) {
60
counter[1]++;
61
} else {
62
return false;
63
}
64
}
65
// for even board, two types of rows should be equal
66
if (boardSizeIsEven) {
67
return counter[0] == counter[1];
68
}
69
return Math.abs(counter[0] - counter[1]) === 1;
70
}
71
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0