Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2015, 21:32   #1
isst
Пользователь
 
Регистрация: 02.01.2015
Сообщений: 85
Сообщение Шарики (одномерный массив)

И снова здравствуйте! Попалась вот такая задачка:

В одной компьютерной игре игрок выставляет в линию шарики разных цветов. Когда образуется непрерывная цепочка из трех и более шариков одного цвета, она удаляется из линии. Все шарики при этом сдвигаются друг к другу, и ситуация может повториться.

Напишите программу, которая по данной ситуации определяет, сколько шариков будет сейчас "уничтожено". Естественно, непрерывных цепочек из трех и более одноцветных шаров в начальный момент может быть не более одной.

Входные данные
Сначала вводится количество шариков в цепочке (не более 1000) и цвета шариков (от 0 до 9, каждому цвету соответствует свое целое число).

Выходные данные
Требуется вывести количество шариков, которое будет "уничтожено".

Пример:
Вход: 5 1 3 3 3 2
Выход: 3

Попробовал решить, но она далеко не всегда выдает правильные ответы. Прошу помочь мне разобраться, где ошибка. Мой код:

Код:
var MAS:aRRay of LongInt;
    N, i:IntegeR;
    cur, c1, c2:Byte;

begin
  readln(N);
  SetLength(MAS, N);
  for i:= loW(MAS) to HigH(MAS) do read(MAS[i]);
  cur:= MAS[loW(MAS)];
  c1:= 1;
  c2:= 0;
  for i:= loW(MAS) + 1 to HigH(MAS) do
  begin
    if (MAS[i] = cur) then inc(c1)
    else
    begin
      cur:= MAS[i];
      if (c1 > c2) then begin c2:= c1; c1:= 1; end;
    end;
  end;
  if (c1 > c2) then writeln(c1)
  else writeln(c2);
end.
isst вне форума Ответить с цитированием
Старый 27.01.2015, 22:11   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Наверное, нужно просматривать не в цикле for, а в while, и при очистке цепочки отступить на 2 элемента назад. На 2 элемента - потому, что удаляется по 3, но ранее они не были удалены.
FPaul вне форума Ответить с цитированием
Старый 27.01.2015, 23:18   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
В одной компьютерной игре игрок выставляет в линию шарики разных цветов
А он может выбирать цвет и положение шарика? У меня в голове не укладывается, как выглядит эта игра... Пожалуйста, объясните подробнее, что это такое?
8Observer8 вне форума Ответить с цитированием
Старый 28.01.2015, 01:15   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

8Observer8,
ничего игрок не может выбирать.
Это же не игра, а олимпиадная задача - на входе количество и расположение шариков, программа должна определить, сколько шариков "схлопнется".
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.01.2015, 07:07   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
8Observer8,
ничего игрок не может выбирать.
Это же не игра, а олимпиадная задача - на входе количество и расположение шариков, программа должна определить, сколько шариков "схлопнется".
Это я понимаю. Хочу создать игру, где было бы применимо решение этой задачи. Я создал тему: ссылка
8Observer8 вне форума Ответить с цитированием
Старый 28.01.2015, 07:07   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я бы писал отдельную функцию по поиску последовательности шариков и гнал бы ее по массиву. Функция должна понимать - количество элементов в массиве, стартовая позиция. А дальше дело техники.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.01.2015, 07:52   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

А я бы делал так :
бахнул список(хотя и массив зайдет).. но a[i] != цвету шарика.. a[i] есть кол-во шариков одного цвета, расположенных i-ыми в последовательности
тоесть

5 1 3 3 3 2
Массив будет такой
1 3 1
Причем будем еще запоминать цвет. Поэтому будет структурка
Дальше бы я тупо бегал по списку, пока мы можешь что-нить удалить
Искал бы первый элемент > 3 и удалял его(это сделать нужно аккуратно, чтобы сложить в случае "одинаковости" цветов его соседей)..
вот
Poma][a вне форума Ответить с цитированием
Старый 28.01.2015, 08:07   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
5 1 3 3 3 2
Массив будет такой
1 3 1
Не такой, а такой 5 1 2. Шарики одного цвета убираются все.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 28.01.2015, 08:22   #9
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Стоп.
5 - это вообще кол-во шариков
Изначально получаем :
1 3 1
А уже потом удаляем
и получаем
1 1

Решил написать
Код:
#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

struct st
{
	int n, cnt;
};

bool f(st& a)
{
	return a.cnt >= 3;
}

int main()
{
	int n;
	cin >> n;
	
	list<st> ball;
	st t;
	t.n = -1;
	t.cnt = 1;
	ball.push_back(t);	


	for (int i = 0; i < n; i++)
	{
		cin >> t.n;
		if (ball.back().n == t.n)
			ball.back().cnt++;
		else
			ball.push_back(t);
	}

	t.n = n+1;
	t.cnt = 1;
	ball.push_back(t);
	
	int cnt = 0;
	while (true)
	{
		list<st>::iterator b = find_if(ball.begin(), ball.end(), f);
		if (b == ball.end())
			break;

		cnt += b->cnt;		
		list<st>::iterator a = --b;
		b++;
		
		list<st>::iterator c = ++b;
		--b;
		
		if (a->n == c->n)
		{
			a->cnt += c->cnt;
			ball.erase(c);
		}
		ball.erase(b);
	}

	cout << cnt;

	return 0;
}

Последний раз редактировалось Stilet; 28.01.2015 в 09:39.
Poma][a вне форума Ответить с цитированием
Старый 28.01.2015, 09:38   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Стоп.
5 - это вообще кол-во шариков
Изначально получаем :
1 3 1
А уже потом удаляем
и получаем
1 1
я бы предостерёг заменять цвета количеством!
дело в том, что "засада" в данной задаче, имхо, в том,
что схлопывания могут возникать циклически.
например,
дан ряд шариков (количество 9):
1 2 3 3 3 2 2 1 1

так вот, "схлопнутся" все 9 шариков (ответ 9)

а если дан ряд:
1 4 2 2 2 2 3 3 1 1
то схлопнутся всего 4 шара.

Если, как Вы предлагаете, переводить цвета в количество, то повторные схлопывания невозможно будет провести.
А вот идея со списком мне нравится - в отличие от массива удаление из начала/середины списка не приводит к необходимости перемещать весь "хвост" на место удалённых элементов.

p.s. на мой взгляд в коде автора темы нужно заменить цикл FOR на while(repeat) и повторять цикл, пока с новой строке есть серии подряд идущих элементов.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование в VBA: двумерный массив M на N, нужно создать новый одномерный массив TheAnnihilyator Помощь студентам 1 04.06.2014 09:16
Найти одномерный массив элементы которого равны минимальным значениям в строках исходной матрицы и одномерный массив элементы... Richik123 Microsoft Office Excel 1 16.10.2013 15:45
Двумерный массив развернуть в одномерный массив по строкам[QBASIC] TrueStyle777 Помощь студентам 3 29.05.2013 21:56
Дан одномерный массив, сформировать новый массив по заданному правилу {Delphi} Nickolai47 Помощь студентам 5 16.12.2012 14:51
Одномерный массив. Q basic - Построить новый массив из элементов исходного ,которые больше P. Marishkaa Помощь студентам 2 12.01.2010 16:54