Loading...
PetyoPetrov avatar PetyoPetrov 19 Точки

Programming Basics Exam 26 April 2015 Evening,Problem 5...на косъм от решението..

Моля някой да погледне задачата, разписал съм логиката, почти като авторското решение е(след като моето не даваше резултат се насочих към авторското), но нещо не е както трябва. Гледам всичко вече твърде много време и може би пропускам нещо очевидно...Съвети?!?

 

http://pastebin.com/64sSErWw

Тагове:
0
Programming Basics 12/01/2016 21:25:57
beBoss avatar beBoss 507 Точки
Best Answer

Ами поиграх си малко с твоето решение и се опитах да не го променям, за да си видиш грешките, но сега като коментирам ще се опитам да ти кажа г/д къде са.

Първо в първият ти цикал е само единят борд, трябва да са двата.

        for (int i = 0; i < pairs; i++)
        {
            x = int.Parse(Console.ReadLine());
            y = int.Parse(Console.ReadLine());
            oldboard[x] |= (1 << y);
            newboard[x] |= (1 << y);
        }

След това currentbit трябва да ти е от новият борд, не от стартият(естествено ти си решаваш кое как ще ползваш като име, но по-надолу при проверките вече има значение)

 int currentbit = (newboard[red] & (1 << kol)) == 0 ? 0 : 1;

Имаш няколко грешки при math min и max (startkol ти е min), както и объркани знаци(вместо + има - и обратното)

                int startred = Math.Max(red - 1, 0);
                int endred = Math.Min(red + 1, 9);
                int startkol = Math.Max(kol - 1, 0);
                int endkol = Math.Min(kol + 1, 9);

По-надолу двата цикъла не ги въртиш правилно, т.е. не включват последният ред и колана ("<="), трябва да са така:

 for (int k = startred; k <= endred; k++)

и

for (int l = endkol; l >= startkol; l--)


Също така махнах 

 List<int> coordinates = new List<int>();

понеже няма никаква логика от него и само ти бави програмата, останалото може да си го видиш и почоплиш сам :)

Работещ твоят код 100/100 -> тук

п.с. Няма значение при теб кои боард в случая ползвaш за проверката на битовете, но ти работиш с единя после печатиш другия, не виждам как така си оплел нещата. Все едно си копирал авторското решение и си се опитал всичко наобратно да направиш. Все пак се надявам да съм ти помогнал :)

 

Поздрави,

beBoss

 

1
13/01/2016 06:49:29
PetyoPetrov avatar PetyoPetrov 19 Точки

Вторият борд не е в цикъла, защото искам той да е поредица от 10 нули. Идеята ми е: проверявам по стария борд ако

(1)currentbit ==0 дали е заобиколен от 3 единиции -тогава в новия борд правя единица бита на позицията на currentbit, 

или

(2) ако currentbit== 1дали  е заобиколен от 1единица или повече от 2 единици-съответно в новия борд  занулявам бита на тази позиция.

Индексите  са ми верни. При координати на бита 1,6  стартред == 0 ендред == 2, стартроу == 7, ендроу ==5

 checkedbit са с координати 0,7 0,6 0,5 1,7 1,6......2,6 2,5. //първата цифра отговаря на индекса на числото в масива, втората цифра е позицията- 0 ми е първото число, 7ми поцицията на бита 

int startred = Math.Max(red - 1, 0);
 int endred = Math.Min(red + 1, 9);
int startkol = Math.Min(kol + 1, 9);
int endkol = Math.Max(kol - 1, 0);

Това ми е логиката...Това, което Вие сте ми корегирали не само проверява по различен начин checkedbit ако не се лъжа, но прави и цялата логика като в авторското решение, мисля...(то разликата е в това как изглежда новия борд и начин на проверка на битовете checkedbit...currentbit на мен също ми е от стария борд)

Поправих си грешките в цикъла, действително го въртях неправилно и листа от координати го махнах(Беше от предходен опит за решение).Сега чак видях тези неща за погрешно въртене-бях разменил endrow и startrow, но и още нещо- там където имах 1 заобиколена от 2 единици не правех така, че в newboard да стане единица(Все пак там имам само нули):  бил съм изпуснал този else 

if (currentbit == 1)
                {
                    if (countones < 2 || 3 < countones)
                    {
                        newboard[red] &= ~(1 << kol);
                    }
                    else
                    {
                        newboard[red] |= (1 << kol);
                    }
                }

 Дава ми 100/100 и по моя начин http://pastebin.com/xv84BpJv. Аз просто не бях обяснил внимателно накъде върви моята мисъл, заради това ми корегирахте толкова неща. Действително сте отбелязали и именно тези,като цикъла, където и в моята логика куцаха.

Поздрави ! ! !

П.С. Благодаря Ви за вниманието и старанието, което положихте  : )))

1
13/01/2016 11:44:33
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.