[Solved] 02.Bunny Kill Не мога да си намеря проблема
Гледах видеото от 07/10/2016, където Иво я решава и не ми помага да си разбера проблема. Мога да копирам неговия код - но къде е смисъла в това? Освен това, ако изключим резултата, смятам, че моя подход е по-готин. Ето какво съм направил :
function bunnyKill(input) {
let matrix = [];
let bombsIndex = input.pop().split(' ');
input.forEach(line => matrix.push(line.split(' ').map(Number)));
for (let bombIndex of bombsIndex) {
let [bombRow, bombCol] = bombIndex.split(',').map(Number);
let damage = matrix[bombRow][bombCol];
for (let row = 0, n = matrix.length; row < n; row++) {
for (let col = 0, m = matrix[row].length; col < m; col++) {
if ((Math.abs(row - bombRow) <= 1 && Math.abs(col - bombCol) <= 1) && (col !== bombCol || row !== bombRow)) {
matrix[row][col] = Math.max(0, matrix[row][col] - damage);
}
}
}
}
let sum = 0,
counter = 0;
for (let row of matrix) {
for (let col of row) {
sum += col;
if (col > 0) {
counter++;
}
}
}
console.log(sum);
console.log(counter);
// for (let row = 0; row < matrix.length; row++) {
// let str = '';
// for (let col = 0; col < row.length; col++) {
// if (matrix[row][col].toString().length === 1) {
// str += ' ' + matrix[row][col];
// } else {
// str += ' ' + matrix[row][col];
// }
// }
// console.log(str);
// }
}
Закоментирания цикъл някарая има за цел да принтира матрицата с подравнени колони, за да се вижда по-лесно. Това, което ми харесва в този подход е, че след като минат бомбите в матрицата остават стйности x == 0 или x > 0. Тоест единственото, което остава е да сумираме матрицата с два цикъла и където има жив заек ( x > 0 ) да увеличаваме counter. Основната разлика в кода е, че аз обхождам матрицата и ползвам разликата между индексите на всяка клетка спрямо индексите на бомбите, а Иво си написа функция, която обхожда всяка клетка около бомбата ( във всички посоки ) и после за да не излиза извън матрицата, си написа втора функция, която да държи стойностите от първата функция в границите на матрицата.
Edit: Оказва се, че ако има две бомби една до друга може да възникне следния проблем - първата гърми, но не убива втората. Дотук - добре, но когато втората бомба се взриви убива или нанася щети на първата и така се губят от точките на Сноубоу. Проблема се решава като към damage-а на Сноубоу се добавят убийствата на бомбите и се нулира стойноста на кетката, още при проверката.
If-a си работи. Представлява алгоритъм, с който намираш околните клетки, вместо да обикаляш всяка клетка, една по една и да проверяваш дали клетките са в матрицата, или извън. Общо взето гледаш разстоянието между бомбата и всяка клетка. Ако е <= 1, коригираш стойностите. Проблема беше в реда, защото ако има две бомби, първата удари втората, но не я убие и втората избухне може да убие първата, което не се брои за Сноубоу. Коригирах го. Обновявам въпроса. Мерси за отговора :)