Проблем със задачата Neuron Mapping от изпита на пролетната академия


3
Преди няколко дни се хванах и изреших всичките задачи от този изпит - http://bgcoder.com/Contest/Practice/131
Последната я реших със стрингове и системата ми даде 100 точки, но днес реших да видя как ще се справя ако я реша с матрици, но нещо не ми се получава, дава ми 70 точки, фейлва на 3 теста и не мога да разбера защо... някой може ли евентуално някой да ми прегледа кода и да каже защо не работи правилно?
Ето го кода - http://pastebin.com/ukv7YGaM



Отговори



2

Проблема е в метода  HasHoles(), който не отчита случаите в които имаш бит на нулева позиция. Например при 10000000000000000000000000000001 ти правиш lasBit = matrix[row, 0] ,което е 1, а по-надолу питаш: if (currentBit != lasBit && currentBit == 1) за да ти отчете beginOne. Но в случая currentBit ти е също 1 и така го изпускаш.

Това е така защото първия if (i != 0) изпуска да зададе lasBit=0 в случая i=0. Така че всичко което трябва да направиш е да добавиш един else към него и да нулираш lasBit:

if (i != 0)
{
     lasBit = matrix[row, i - 1];
}
else
{
     lasBit = 0;
}

 

Иначе, ако имаш желание можеш да разгледаш ето това решение, което съм направил без масиви.


от Flystar (1171 точки)


0
Мерси много, не знам как съм го пропуснал... даже това lasBit трябваше да е lastBit ... срам ме е чак...

от scarylabcat (801 точки)


0

Ето от тук можеш да си изтеглиш входните данни и очакваните изходни данни на тестовете, за да се ориентираш кои са случаите, в които гърми. Например, тест 10, който ти гърми, пълни цялата матрица с единици и ти трябва да върнеш цялата матрица с единици, с изключение на всички крайни клетки. В този случай ти връщаш нули.


от varbanoff (2325 точки)


2

Ако ти е интересно да видиш още един вид решение от мен - Neuron. С две думи запазвам входа в лист. Обръщам всички битове (0->1 и 1->0), след което обръщам всички битове със стойност 1 отляво надясно докато не се стигне бит със стойност 0. Същото правя птдясно наляво. Получава се едно кратичко решение.


от nikivat (246 точки)


0
Ще го разгледам, както и решението на колегата Flystar. Ето моето първоначално решение със стрингове - http://pastebin.com/LwAfF6pV

от scarylabcat (801 точки)


0
Най-забавната задача в този изпит. Пълна е обаче с подводни камъни. Моето решение включва побитови операции. Използвал съм два метода за по добра четимост. Дано се е получило.
http://pastebin.com/KiT2FSFv

от stinger907 (307 точки)


2

Реших да пусна тук и моето решение, тъй като не виждам друго подобно, а мисля, че е доста нестандартно и интересно :) Блъсках се 4-5 часа с тази задача, като пробвах различни начини. 

Решението е просто, тъпча реда с единици докато не стигна до единица.

После го хващам от другия край и правя същото.

Като приключа му обръщам битовете и готово :)

Визуално се разбира по-лесно: (1 до 4 са стъпките)

......11.....1..................    1

11111111.....1..................    2

11111111.....1111111111111111111    3

........11111...................    4

http://pastebin.com/EJSNQ3JY


от dimo.petrof (2887 точки)


0

Колеги, споделям и моето решение: http://pastebin.com/VnrbYv9p

Варианта на webdude е много идеен.


от IvoPN (10 точки)