class qNode {
constructor(x, y, dist) {
this
.x = x;
this
.y = y;
this
.dist = dist;
}
}
const dirx = [0, 1, 0, -1];
const diry = [1, 0, -1, 0];
let R = 0;
let C = 0;
function
isValid(x, y) {
if
(x < 0 || y < 0 || x >= R || y >= C) {
return
false
;
}
return
true
;
}
function
isBorder(i, j, arr) {
for
(let idx = 0; idx < 4; idx++) {
const x = i + dirx[idx];
const y = j + diry[idx];
if
(isValid(x, y) && arr[x][y] ===
'W'
) {
return
true
;
}
}
return
false
;
}
function
dfs(i, j, visited, q, arr) {
visited[i][j] =
true
;
if
(isBorder(i, j, arr)) {
q.push(
new
qNode(i, j, 0));
}
for
(let idx = 0; idx < 4; idx++) {
const x = i + dirx[idx];
const y = j + diry[idx];
if
(isValid(x, y) && arr[x][y] ===
'L'
&& !visited[x][y]) {
dfs(x, y, visited, q, arr);
}
}
}
function
bfs(q, visited, arr) {
while
(q.length > 0) {
const p = q.shift();
for
(let idx = 0; idx < 4; idx++) {
const x = p.x + dirx[idx];
const y = p.y + diry[idx];
if
(isValid(x, y) && arr[x][y] ===
'L'
&& !visited[x][y]) {
return
p.dist;
}
if
(isValid(x, y) && arr[x][y] ===
'W'
&& !visited[x][y]) {
q.push(
new
qNode(x, y, p.dist + 1));
visited[x][y] =
true
;
}
}
}
return
-1;
}
function
minConversions(arr) {
R = arr.length;
C = arr[0].length;
const q = [];
const visited = Array(R).fill().map(() => Array(C).fill(
false
));
let flag =
false
;
for
(let i = 0; i < R; i++) {
for
(let j = 0; j < C; j++) {
if
(arr[i][j] ===
'L'
) {
dfs(i, j, visited, q, arr);
flag =
true
;
break
;
}
}
if
(flag) {
break
;
}
}
return
bfs(q, visited, arr);
}
const arr = [[
'W'
,
'L'
,
'W'
], [
'W'
,
'W'
,
'W'
], [
'W'
,
'W'
,
'L'
]];
console.log(minConversions(arr));