Loading...
achobanov avatar achobanov -4 Точки

[Solved] 02.Bunny Kill Не мога да си намеря проблема

Задaча.

Гледах видеото от 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-а на Сноубоу се добавят убийствата на бомбите и се нулира стойноста на кетката, още при проверката. 

Тагове:
0
Module: JS Advanced 16/10/2016 00:25:25
butanfire avatar butanfire 32 Точки

Привет,

На пръв поглед if-a изглежда объркан или аз немога да вникна.

Второ - убиването на зайците с бомбите трябва да е под ред. И като убиеш заека с бомбата той гърми, ти го правиш наобратно.

Мисля, че доста хора направиха тия грешки :D 
Иначе има video за тая задача, ако отделиш още време ще я разгадаеш.

 

Поздрави,

Владо

0
achobanov avatar achobanov -4 Точки

If-a си работи. Представлява алгоритъм, с който намираш околните клетки, вместо да обикаляш всяка клетка, една по една и да проверяваш дали клетките са в матрицата, или извън. Общо взето гледаш разстоянието между бомбата и всяка клетка. Ако е <= 1, коригираш стойностите. Проблема беше в реда, защото ако има две бомби, първата удари втората, но не я убие и втората избухне може да убие първата, което не се брои за Сноубоу. Коригирах го. Обновявам въпроса. Мерси за отговора :)

0
16/10/2016 00:28:35
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.