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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2013, 10:36   #1
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию Задача с муравьями

Здравствуйте!
У меня возникла проблема со следующей задачей:
Цитата:
N Муравьев в момент времени 0 начинают одновременно двигаться по горизонтальному отрезку со скоростью 1см в секунду в заданных направлениях . Если 2 муравья сталкиваются , то они мгновенно разворачиваются и двигаются с прежней скоростью в противоположенном направлении. Муравей, дошедший до края отрезка падает. Определите, через сколько секунд упадет последний муравей.
Требования к задаче:
Реализовать интерфейс ввода данных и визуализировать решение задачи.
В моей задумке показать муравьев и веточку простыми символами, например вот так: -->-->--<->--<<--, где '-' пустой участок, '<'/'>' муравей двигающийся налево/направо.

Ну и "накатал" я программку, пока еще начало, но строку "vetka" выводит неправильно (например, должен вывести ">-<-->", а выводит "0032DA9C")

Код:
#include <iostream>
#include <locale.h>
#include <string>

using namespace std;

int main()
{
	setlocale(LC_ALL,"Rus");
    long int n,l,i,myrav; char c; string vetka[256];
	cout << "Введите длину отрезка: "; cin >> l;
	cout << "Введите общее кол-во муравьев: "; cin >> n;
	for (i=1;i<=l;i++)
	{
		vetka[i]='-';
	}
	for (i=1;i<=n;i++)
	{
		cout << "Введите координату " << i << "-го муравья: "; cin >> myrav;
		cout << "Введите нарпавление " << i << "-го муравья (L или R): "; cin >> c;
		if (c=='R')
		{
			vetka[myrav]='>';
		}
		else vetka[myrav]='<';
	}
	cout << vetka;
	cin >> i;
    return 0; 
}

Последний раз редактировалось Ghost3; 19.02.2013 в 10:39.
Ghost3 вне форума Ответить с цитированием
Старый 19.02.2013, 12:15   #2
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Программу доработал, выводит все правильно, но почему-то не работает движение муравья направо:

Код:
#include <iostream>
#include <locale.h>
#include <string>

using namespace std;

int main()
{
	setlocale(LC_ALL,"Rus");
    long int n,l,j,i,m,myrav; char c,vetka[512];
	cout << "Введите длину отрезка: "; cin >> l;
	cout << "Введите общее кол-во муравьев: "; cin >> n;
	m=n;
	for (i=1;i<=l;i++)
	{
		vetka[i]='-';
	}
	for (i=1;i<=n;i++)
	{
		cout << "Введите координату " << i << "-го муравья: "; cin >> myrav;
		cout << "Введите нарпавление " << i << "-го муравья (L или R): "; cin >> c;
		if (c=='R')
		{
			vetka[myrav]='>';
		}
		else vetka[myrav]='<';
	}
	cout << "\n";
	cout << "Пояснение: \n \"-\" пустой промежуток \n \">\" муравей движущийся направо \n \"<\" муравей движущийся налево \n \"*\" два муравья налево и направо (столкновение) \n";
	cout << "\n";
	cout << "Движение муравьев: \n";
	for (i=1;i<=l;i++)
	{
		cout << vetka[i];
	}
	cout << "\n";
	while (m!=0)
	{
		for (i=1;i<=l;i++)
		{
			if (vetka[i]=='<')
			{
				vetka[i]='-';
				if (vetka[i-1]=='-') vetka[i-1]='<';
				else
				{
					if (vetka[i-1]=='>') vetka[i-1]='*';
					else m--;
				}
			}

//здесь описывается работа движения муравья направо

			if (vetka[i]=='>')
			{
				vetka[i]='-';
				if (vetka[i+1]=='-') vetka[i+1]='>';
				else
				{
					if (vetka[i+1]=='<') vetka[i+1]='*';
					else m--;
				}
			}

//здесь описывается работа движения муравья направо

			if (vetka[i]=='*')
			{
				vetka[i]='-';
				if (vetka[i+1]=='-') vetka[i+1]='>';
				else
				{
					if (vetka[i+1]=='<') vetka[i+1]='*';
					else m--;
				}

				if (vetka[i-1]=='-') vetka[i-1]='<';
				else
				{
					if (vetka[i-1]=='>') vetka[i-1]='*';
					else m--;
				}
			}


		}
		for (j=1;j<=l;j++) cout << vetka[j];
		cout << "\n";
	}

	cout << "\n";
	cout << "Программа завершена";
	cin >> c;
    return 0; 
}
Можете помочь с ошибкой?
Ghost3 вне форума Ответить с цитированием
Старый 20.02.2013, 13:29   #3
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Таки почти решил (а мне никто даже и не ответил здесь =\)
Но есть одна проблема - не могу завершить цикл while. Если подставить m--; (или m=0) чтобы когда-нибудь m=0, то программа вообще ничего не выводит =\
Помогите пожалуйста!

Код:
#include <iostream>
#include <locale.h>
#include <string>

using namespace std;

int main()
{
	setlocale(LC_ALL,"Rus");
    long int t=0,n,l,j,i,m,myrav; char c,vetka[512]; string konec;
	cout << "Введите длину отрезка: "; cin >> l;
	cout << "Введите общее кол-во муравьев: "; cin >> n;
	m=n;
	for (i=1;i<=l;i++)
	{
		vetka[i]='-';
	}
	for (i=1;i<=n;i++)
	{
		cout << "Введите координату " << i << "-го муравья: "; cin >> myrav;
		cout << "Введите нарпавление " << i << "-го муравья (L или R): "; cin >> c;
		if (c=='R')
		{
			vetka[myrav]='>';
		}
		else vetka[myrav]='<';
	}

	cout << "\n";
	cout << "Пояснение: \n \"-\" пустой промежуток \n \">\" муравей движущийся направо \n \"<\" муравей движущийся налево \n \"X\" два муравья налево и направо (столкновение) \n";
	cout << "\n";
	cout << "Движение муравьев: \n";
	for (i=1;i<=l;i++)
	{
		cout << vetka[i];
	}
	cout << "\n";

                //--------------------------------------------------------------
                //Здесь как бы просчитывается движение муравьев, смотрите только на "while"
                //--------------------------------------------------------------

	while (m!=0)
	{
		for (i=1;i<=l;i++)
		{
			if (vetka[i]=='<')
			{
				vetka[i]='-';
				if (vetka[i-1]=='-') vetka[i-1]='<';
				if (vetka[i-1]=='>')
				{
					vetka[i-1]='<';
					vetka[i]='R';
				}
				if (vetka[i-1]=='X')
				{
					vetka[i]='R';
					vetka[i-1]='<';
					vetka[i-2]='<';
				}
			}

			if (vetka[i]=='X')
			{
				vetka[i]='-';
				if (vetka[i-1]=='-') vetka[i-1]='<';
				if (vetka[i-1]=='>')
				{
					vetka[i]='R';
					vetka[i-1]='<';
				}
				if (vetka[i+1]=='-') vetka[i+1]='R';
				if (vetka[i+1]=='>') vetka[i+1]='Y';
				if (vetka[i+1]=='<')
				{
					vetka[i]='<';
					vetka[i+1]='R';
				}
			}

		}

		for (i=l;i>=1;i--)
		{
			if (vetka[i]=='>')
			{
				vetka[i]='-';
				if (vetka[i+1]=='-') vetka[i+1]='>';
				if (vetka[i+1]=='<') vetka[i+1]='X';
			}
			if (vetka[i]=='Y')
			{
				vetka[i]='R';
				if (vetka[i+1]=='-') vetka[i+1]='R';
				if (vetka[i+1]=='<') vetka[i+1]='X';
			}
		}

                //--------------------------------------------------------------
                //здесь выводится веточка на экран
                //--------------------------------------------------------------

		for (j=1;j<=l;j++)
		{
			//--------------------------------------------------------------
			//Например, если вставить сюда m=0 для завершения цикла, то прога ничего не выведет
			//--------------------------------------------------------------
			//Пусть "q" - приписано в "int" и перед этим циклом всегда обнуляется
			//--------------------------------------------------------------
			// if (vetka[j]!='-') q++;

			if (vetka[j]=='R') vetka[j]='>';
			cout << vetka[j];
		}
			
			//if (q==0) m=0;
			
		t++;
		cout << "\n";
	}

	cout << "Через " << t <<" секунд упадет последний муравей\n";
	cout << "\n";
	cout << "Программа завершена";
	cin >> konec;
    return 0; 
}

Последний раз редактировалось Ghost3; 20.02.2013 в 13:43.
Ghost3 вне форума Ответить с цитированием
Старый 20.02.2013, 15:22   #4
Develop
Пользователь
 
Регистрация: 26.06.2010
Сообщений: 52
По умолчанию

У меня все работает

В самом конце цикла while (m!=0) нужно добавить такое:
Код:
  m = 0;
  for(j=1;j<=l;j++)
    if(vetka[j] != '-') m++;
Develop вне форума Ответить с цитированием
Старый 11.04.2013, 18:32   #5
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Ой, извините что отвечаю в старой теме, надеюсь меня не накажут за это, забыл про сайт, смотрю темка с ответом не просмотренным :D Задачку решил, давненько правда, вот выкладываю решение, вдруг какому-нибудь студенту понадобится, могу если что пояснить что зачем и к чему:

PS: возможно не все варианты положений муравьев тут просмотрены, но я отослав эту одну-единственную программу "судьям" (ну или организаторам, не знаю кто там ) они приглашали на олимпиаду. Наверное им понравилось :D

Код:
#include <iostream>
#include <locale.h>
#include <string>

using namespace std;

int main()
{
	setlocale(LC_ALL,"Rus");
    long int t=0,n,l,j,i,q,m=1,myrav; char c,vetka[512]; string konec;
	cout << "Задача 2. Муравьи \n";
	cout << "Введите длину отрезка: "; cin >> l;
	cout << "Введите общее кол-во муравьев: "; cin >> n;
	for (i=1;i<=l;i++)
	{
		vetka[i]='-';
	}
	for (i=1;i<=n;i++)
	{
ddd:	cout << "Введите координату " << i << "-го муравья (0 - просмотр текущего состояния ветки): "; cin >> myrav;
		if (myrav==0)
		{
			cout << "\n" << "~~~ \n";
			for (j=1;j<=l;j++) cout << vetka[j];
			cout << "\n" << "~~~ \n" << "\n";
			goto ddd;
		}
		cout << "Введите нарпавление " << i << "-го муравья (L или R): "; cin >> c;
		if (c=='R')
		{
			vetka[myrav]='>';
		}
		else vetka[myrav]='<';
	}

	cout << "\n";
	cout << "Пояснение: \n \"-\" пустой промежуток \n \">\" муравей движущийся направо \n \"<\" муравей движущийся налево \n \"X\" два муравья налево и направо (столкновение) \n";
	cout << "\n";
	cout << "Движение муравьев: \n";
	for (i=1;i<=l;i++)
	{
		cout << vetka[i];
	}
	cout << "\n";

	while (m!=0)
	{
		for (i=1;i<=l;i++)
		{
			if (vetka[i]=='<')
			{
				vetka[i]='-';
				if (vetka[i-1]=='-') vetka[i-1]='<';
				if (vetka[i-1]=='>')
				{
					vetka[i-1]='<';
					vetka[i]='R';
				}
				if (vetka[i-1]=='X')
				{
					vetka[i]='R';
					vetka[i-1]='<';
					vetka[i-2]='<';
				}
				if (vetka[i-1]=='R') vetka[i-1]='X';
			}

			if (vetka[i]=='X')
			{
				vetka[i]='-';
				if (vetka[i-1]=='-') vetka[i-1]='<';
				if (vetka[i-1]=='>')
				{
					vetka[i]='R';
					vetka[i-1]='<';
				}
				if (vetka[i+1]=='-') vetka[i+1]='R';
				if (vetka[i+1]=='>') vetka[i+1]='Y';
				if (vetka[i+1]=='<')
				{
					vetka[i]='<';
					vetka[i+1]='R';
				}
			}

		}

		for (i=l;i>=1;i--)
		{
			if (vetka[i]=='>')
			{
				vetka[i]='-';
				if (vetka[i+1]=='-') vetka[i+1]='>';
				if (vetka[i+1]=='<') vetka[i+1]='X';
			}
			if (vetka[i]=='Y')
			{
				vetka[i]='R';
				if (vetka[i+1]=='-') vetka[i+1]='R';
				if (vetka[i+1]=='<') vetka[i+1]='X';
			}
		}

		q=0;
		for (j=1;j<=l;j++)
		{
			if (vetka[j]!='-') q=1;
			if (vetka[j]=='R') vetka[j]='>';
			cout << vetka[j];
		}
		t++;
		cout << "\n";
		if (q==0) m=0;
	}

	cout << "Через " << t <<" секунд упадет последний муравей\n";
	cout << "\n";
	cout << "Программа завершена \n";
	cin >> konec;
    return 0; 
}

Последний раз редактировалось Ghost3; 11.04.2013 в 18:36.
Ghost3 вне форума Ответить с цитированием
Старый 11.04.2013, 18:45   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
N Муравьев в момент времени 0 начинают одновременно двигаться по горизонтальному отрезку со скоростью 1см в секунду в заданных направлениях . Если 2 муравья сталкиваются , то они мгновенно разворачиваются и двигаются с прежней скоростью в противоположенном направлении. Муравей, дошедший до края отрезка падает. Определите, через сколько секунд упадет последний муравей.
Требования к задаче:
Реализовать интерфейс ввода данных и визуализировать решение задачи.
За вычетом визуализации, задачу можно было бы решить заметно проще: последний муравей упадёт за максимум по всем муравьям (времени, через которое упал бы этот муравей, если бы он был на отрезке один).
Обратили внимание, что муравьи будто бы "проходят" друг сквозь друга?
Abstraction вне форума Ответить с цитированием
Старый 12.04.2013, 12:14   #7
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Да, решение понятно сразу, я даже и не задумывался о том, что надо "сталкивать, потом разворачивать направления на 180 градусов..." тупо как будто прошли насквозь =) И естественно время-ответ на задачу будет наибольшее время среди времен всех муравьев =)
Сложная часть была с визуализацией. Надо было продумать все, чтобы букашки не пропадали. Компьютер то не как человек, он строку-веточку слева на право и наоборот, справа налево только обрабатывает, были трудности.
Самый "крупный и интересный проект" который я писал Вот такие задачи действительно в ходе решения вызывают интерес.
Ghost3 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача по подсчёту статистики использования букв. Другая задача - по длинной арифметике Pascal ABC kimberly Паскаль, Turbo Pascal, PascalABC.NET 3 24.12.2012 17:03
задача на структуру(struct)/задача на работу с файлом SevenArth Помощь студентам 0 26.04.2012 19:06
Задача на оптимальный расчет маршрута (задача в презентации) в табличном процессоре Excel Toofed Помощь студентам 0 30.11.2011 01:12
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51