![]() |
joker99
Убрать его физически тебе придётся для освобождения места. Для этого тебе и надо 2 указателя. Ты относишся к массиву как кругу, по которому бегают 2 указателя. Т.е. такая ситуация: Код:
--4768 на нулевой индекс (под первой -). Туда и попадёт новый объект. |
Да, ситуация совершенно законна, но в моём способе это бы выглядело так
Код:
234768 на нулевой индекс (под 2). Туда и попадёт новый объект. |
joker99
Во-во и если ты пишешь на С++, то у тебя memory leak. Иначе тебе придётся удалить объект, как я и сказал: Код:
delete array[head]; |
2 All
Для тех кто решил задачу с петлёй у связного списка. Усложняю задачу. Теперь, после того как один указатель догнал другой, найдите начало петли. Напоминаю, что указатель на Head очереди у вас сохранён. |
2 All
Так еще одна задачка "на засыпку" :) Дано бинарное дерево. Ну, например: Код:
5 Код:
|
Цитата:
|
a_ber
Цитата:
Ладно, раз ты уже спрашивал, даю решение. 1) Ставим один из указателей в начало (head), а второй оставляем указывать на последнюю точку встречи. 2) Пускаем их бежать с одинаковой скоростью. 3) Точка их встречи и будет началом петли. |
Цитата:
|
joker99
Ну да, конечно. А теперь представь такую ситуацию. Мы в языке с GC. Юзер позвал 10 раз enqueue() и 5 раз dequeue(), получил объекты, поработал с ними и благополучно отпустил. И больше не зовёт очередь. Но эти 5 объектов не будет собраны GC, поскольку ты продолжаешь ссылаться на них. А теперь представь, что объекты эти занимают каждый много места. Вота так они и будут болтаться у тебя в памяти как "га*но в проруби". И всё из-за строки которую ты упрямо отказываешся вставить в свой код споришь уже несколько постов: array[head] = null; |
Согласимся на том что мой вариант был для очереди int, а твой ( после добавления delete array[head]) для объектов
|
Вот вам простенькая задачка: дана матрица N*M, заполненная случайным образом 0 и 1. 0-чёрный, а 1-белый цвета. Посчитать число белых "паятен" на чёрном "фоне". Стоящие рядом по вертикали или горизонтали 1 считать за одно пятно (на искосок не считается). Пример:
011100 101101 110001 Здесь 3 "пятна" |
Цитата:
Код:
int iSpots = 0, iCounter = 0; |
Programmer, не верно, ты наверно не правильно понял условие, вот ещё пример:
00100 10001 10101 11110 10101 здесь 4 пятна |
V@nya
Больше 2-х единиц как по вертикали так и по горизонтали? Или одна единица? |
Может так:
Код:
int iSpots = 0 |
joker99, почти правильно,но если i=0, то FillSpot(matrix,i-1,j); вылетит с ошибкой т.к. будет присваивать m[-1,j] двойку.
Я функцию FillSpot (kill) делал так: void kill(int i, int j) { m[i][j]=0; if (i>1) if (m[i-1][j]==1) kill(i-1,j); if (i<N) if (m[i+1][j]==1) kill(i+1,j); if (j>1) if (m[i][j-1]==1) kill(i,j-1); if (j<M) if (m[i][j+1]==1) kill(i,j+1); } Массив был глобальной переменной |
Programmer, едениц может быть сколько угодно.
|
Вот вам еще легонькая задачка.
дано: 1 1 1 = 6 2 2 2 = 6 3 3 3 = 6 4 4 4 = 6 5 5 5 = 6 6 6 6 = 6 7 7 7 = 6 8 8 8 = 6 9 9 9 = 6 Требуется: используя ЛЮБЫЕ арифмитические знаки, сделайте выражение верным. Например: 2 + 2 + 2 = 6. Какие угодно знаки и где угодно. Главное, что-бы выражение было правильным. взято с аудиогейта Там же и решение. Так что не смотрите заранее. |
3*3-3=6
|
6*6/6=6
6+6-6=6 |
2+2+2=6
|
V@nya
А ты не мог написать всё в одном посте? Или посты накручиваешь? Так это запрещено. P.S. Ты решил самые простые примеры :winkgrin: |
Programmer, посты я не накручиваю, просто как решу пример, сразу кидаю решение, чтобы быть первым.
sqrt(4)+sqrt(4)+sqrt(4)=6 sqrt(9)*sqrt(9)-sqrt(9)=6 куб.корень(8)+куб.корень(8)+куб.корень(8)=6 5+5/5=6 7-7/7=6 Первый как решать сам не додумался, и глянул ответ. (остальное чесно решал сам). |
Цитата:
|
(1+1+1)! = 6
|
Вот нашёл универсальное решение:
(x^0+x^0+x^0)!=6 где x^0 - это x в 0 степени, а х - любая цифра |
Цитата:
|
Еще одна задачка
Есть лестница N ступенек по ней поднимаеться человек, может наступить на следующую ступеньку, через одну ступеньку, и через две (случайным образом) Нужно посчитать количество вариантов которыми он может подняться на верх. Для N = 4 1 1 1 1 2 1 1 1 2 1 1 1 2 2 2 3 1 1 3 И того семь вариантов подняться... |
Если неправильно - поправьте ;)
Всего N ступенек и 3 способа подняться с каждой из них на следующую: 3^n вариантов. Но при поднятии через одну или две ступеньки мы теряем соответственно 1 или 2 варианта. Так как все способы распределены равномерно, то: (3^n) - (n/3)*2 - (n/3)*1. Насчет равномерности я соврал ;), потому что есть еще и конец лестницы, в котором, начиная с какого-то момента, не получится перешагнуть через 1 или 2 ступеньки: (3^n) - (n/3)*2 - (n/3)*1 - 2 - 1. Вроде так, или в конце рабочего дня я уже не соображаю ;) |
To ARTi
В твоем варианте если N нацело на 3 не делиться, то вообще получаеться дробное количество вариантов. |
Vellion
А почему у тебя не присутствует вариант 2 2? И еще у тебя в условии не было сказано что он может через 3 пойти. Может я чего не понял, поправь :) |
To Avanturist
Да насчет варианта 2 2 совершенно прав, пропустил я. 1 - на следующую 2 - через одну 3 - через две Варианта как пойти может 3 |
а для n-ого количества ступенек пусть думает кампутер...
var a,b,c,n:=integer; begin readln(n); for a:=0 to n do for b:=0 to n div 2 do for c:= 0 to n div 3 do if a + 2*b + 3*c = n then step:=step+1; writeln(step); end. если не прав, поправьте :) |
To Bzzik
Не так все просто. В твоем случае варианты 2 1 1 1 2 1 1 1 2 Это один вариант. Это когда a = 2, b = 1, c = 0 А должно быть три. |
Vellion
Давай ответ, не томи. :) |
а так?
Код:
int NumberOfRoutes = 0; |
int a, b, c, k;
k = 0; for (b = 0; b <= N / 2; b++) for (c = 0; c <= (N - b*2) / 3; c++) { a = N - b*2 - c*3; k += (a + b + c)! / (a! * b! * c!) } Ну самособой это будет работать только для не большик N т.к. int у нас ограничен. А так вместо переменной k результат можно представить в виде массива, и работать уже с масивом. To joker99 У тебя там вроде опечатка if(cur+3<=N) countRoutes(cur+1); помоему должно быть if(cur+3<=N) countRoutes(cur+3); Тогда считает. |
А если усложнить условие, допустим может за один шаг пройти не только 1, 2 или 3 ступеньки, а скажем m ступенек, где m какоето целое число (задаеться в программе). Остальное условие такое же, посчитать количество вариантов.
|
Ну тогда так
Код:
int NumberOfRoutes = 0; |
Зачем делать это циклами? Я понимаю, можно и рекурсию устроить, да такую, чтоб с переполнением стека, но ведь есть же формулы для решения подобных задач, чтобы не городить потом огород.
Я облажался, т.к. формулы этой не помню. Но это не значит, что ее нет ;), а писать циклами можно и операцию умножения. |
Часовой пояс GMT +4, время: 12:18. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.