2
* @param {number[][]} board5
var movesToChessboard = function (board) {6
const boardSize = board.length;7
const boardSizeIsEven = boardSize % 2 === 0;9
if (!canBeTransformed(board)) return -1;11
// to convert to 01010115
// to convert to 10101019
for (let i = 0; i < boardSize; i++) {20
if (board[i][0] === i % 2) {25
if (board[0][i] === i % 2) {32
// no need to swap anything33
if (rowSwap + colSwap === 0 || rowSwap2 + colSwap2 === 0) return 0;35
if (boardSizeIsEven) {36
rowSwap = Math.min(rowSwap, rowSwap2);37
colSwap = Math.min(colSwap, colSwap2);39
rowSwap = rowSwap % 2 === 0 ? rowSwap : rowSwap2;40
colSwap = colSwap % 2 === 0 ? colSwap : colSwap2;43
return (rowSwap + colSwap) / 2;45
function canBeTransformed(board) {46
// number of 0 and 1 should be equal47
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;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 opposite55
for (let i = 0; i < boardSize; i++) {56
let str = board[i].join("");59
} else if (str == opposite) {65
// for even board, two types of rows should be equal66
if (boardSizeIsEven) {67
return counter[0] == counter[1];69
return Math.abs(counter[0] - counter[1]) === 1;