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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2009, 21:16   #11
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
...
Матрица создана. Теперь ищем первый элемент, равный нулю. Это ячейка (i1,j1). Теперь для j1 ищем такой столбец k, для которого (j1,k)=0.
Ну вот так и доходим до конца, в поисках самой длинной цепочки.
Думаю, идея должна быть ясна.
Вот попробовал создать псевдокодовский вариант этого алгоритма:
Код:
Функция(Матрица, i, Массив, s, число)
   Начало
     для j от 1 до число шаг 1
         для k от 0 до число шаг 1
             если (не матрица[j][k]) то
                 начало
                     массив[s++] = k;
                     Функция (Матрица, k, Массив, s, число);
                  конец
    конец
где Матрица - собственно матрица связей, i - элемент для которого мы ищем не связанный, Массив - массив элементов, чтобы на выходе иметь готовю цепочку элементов, s - количество таких элементов и Число - число окружностей всего.
Верно?

Последний раз редактировалось EniOk; 07.06.2009 в 21:19. Причина: Добавил примечание)
EniOk вне форума Ответить с цитированием
Старый 07.06.2009, 21:30   #12
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Не совсем. Там, вроде, один цикл только нужен.
Код:
Функция(Матрица, i, Массив, s, Число, Длина)
 Начало
 для j от 0 до Число
   начало 
   флаг = истина
   для l от 0 до s
     если j == Массив[l] то флаг = ложь
   если (не флаг) или (Матрица[i][j]==0) то continue
   Массив[s++] = j
   Функция(Матрица, j, Массив, s, Число, Длина + 1
   конец 
 Конец
i - номер предыдущего круга, Длина - длина текущей цепочки.
Тут, может, еще что-нибудь надо будет добавить.. Это так, навскидку.

Когда функция проходит по всем окружностям, то нужно смотреть на Длину. И если она больше, чем та, что запомнили ранее (или если еще ничего не запомнили), то нужно ее запомнить.. И сам массив тоже. Вот..
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 12.06.2009, 12:27   #13
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

Итак... Я чесно отпрогал все и... ноль...

проблема: где то идет не верное обращение к массиву или что то в этом духе.
Код:
int MatrixCreator(int **s, int n, CIRCLE *circle)
{
int i2,j2;
for (i2=0;i2 for (j2=0; j2 if (test (circle[i2],circle[j2])) s[i2][j2]=1 ;
int k2;
for (i2=0;i2 for (j2=0;j2 for (k2=0;k2 if(s[k2][i2] && s [j2][k2]) s[i2][j2]=1;
return 0;
}
int Vibor(int **s, int i, int *mas, int*w, int n)
{
for (j1=0;j1 ///for(k1=0;k1 /// if(!s[j1][k1])
/// {
/// mas[*w++]=k1;
/// Vibor(s,k1,mas,w,n);
/// }
k1=1;
for(l=0;l<*w;l++)
if (j1==mas[l]) k1=0;
if ((!k1)||(s[i][j1]==0))
{ *w++;
mas[*w]=j1;
Vibor(s,j1,mas,w,n);

}
}
может кто видит проблему?
EniOk вне форума Ответить с цитированием
Старый 12.06.2009, 12:37   #14
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
for (i2=0;i2 for (j2=0; j2 if (test (circle[i2],circle[j2])) s[i2][j2]=1 ;
int k2;
for (i2=0;i2 for (j2=0;j2 for (k2=0;k2 if(s[k2][i2] && s [j2][k2]) s[i2][j2]=1;
Это что за конструкция такая? о_О
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 12.06.2009, 14:14   #15
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
Смех

Извеняюся) капирую все не думая))
Код:
int MatrixCreator(int **s, int n, CIRCLE *circle)
{
	int i2,j2;
	for (i2=0;i2<n;i2++)
		for (j2=0; j2<n; j2++)
			if (test (circle[i2],circle[j2])) s[i2][j2]=1    ;
	int k2;
	for (i2=0;i2<n;i2++)
		for (j2=0;j2<n;j2++)
			for (k2=0;k2<n;k2++)
				if(s[k2][i2] && s [j2][k2]) s[i2][j2]=1;
return 0;
}
 int Vibor(int **s, int i, int *mas, int*w, int n)
 {
	for (j1=0;j1<n;j1++)
		///for(k1=0;k1<n;k1++)
		///	if(!s[j1][k1])
		///		{
		///			mas[*w++]=k1;
		///			Vibor(s,k1,mas,w,n);
		///		}
		k1=1;
		for(l=0;l<*w;l++)
		if (j1==mas[l]) k1=0;
		if ((!k1)||(s[i][j1]==0))
		{       *w++;
			mas[*w]=j1;
			Vibor(s,j1,mas,w,n);

		}
 }
вот что должно быть)
EniOk вне форума Ответить с цитированием
Старый 12.06.2009, 14:24   #16
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

У вас в функции Vibor тело цикла цикла по j1 не заключено в скобки. Поэтому выполняться будет только
Код:
k1 = 1;
И тут еще условие выхода нужно добавить в начало функции.
И когда вызываете функцию рекурсивно, нужно (n+1) посылать.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 14.06.2009, 13:03   #17
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

Спасибо) Да, вещь глупая, но тока проблема - кончается динамическая память при работе функции выбора. И скорее всего есть ошибка при создании матрицы связанностей... А вот как улучшить алгоритм - неясно(
Помогите плз. Очень надо...
EniOk вне форума Ответить с цитированием
Старый 14.06.2009, 13:43   #18
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
кончается динамическая память при работе функции выбора.
Тогда, наверное, нужно избавиться от рекурсии и использовать обычный цикл с отходом назад.

А в функции создания, возможно, имеет смысл заполнять не только ячейку s[i2][j2], но и s[j2][i2] (то есть обе полуматрицы).
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 20.06.2009, 20:39   #19
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

Итак. Написал не рабочую прогу.
Исходник вот:
Файл Main.cpp
Код:
/************************Preprocessor's operations***********************/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include "d:\ddz\proc.cpp"
/*****************************Global variables***************************/
FILE *in,*out;                   //Servise variables
char inname[80], outname[80];    //Names of input & output files
int count;                       //Count of circles
int i,j,w;				 //
/******************************Main function*****************************/
int main()
{

	clrscr();
	//Ask the user about name of the input file
	printf("Enter the name of input file, please: ");
	scanf("%s", &inname);
	///////////////////////////////////////////

	//Opening input file
	if ((in = FOpen(inname,"r"))==NULL) return 1;
	////////////////////

	//Reading nomber of circles
	fscanf(in, "%d", &count);
	if (count <1)
	{
		printf("Incorrect format of input file\n");
		fclose(in);
		return 1;
	}
	///////////////////////////
	//Declaring array of CIRCLE
	CIRCLE *circle = new  CIRCLE[count];
	////////////////////////

	//Reading circles information
	printf("Information from input file:\n Count of circles: %i\n",count);
	printf("ЙННННННННННННННННННННННННННННННН»\n");
	printf("є #і    X    і    Y    і   R    є\n");
	for (i=0;i<count;i++)
	{
		fscanf(in,"%f %f %f", &circle[i].x, &circle[i].y, &circle[i].r);
		printf("є%2iі  %5.4fі  %5.4fі  %5.4fє\n",i, circle[i].x,circle[i].y,circle[i].r);
		circle[i].crossflag=0;
	}
	printf("ИНННННННННННННННННННННННННННННННј");
	/////////////////////////////
	//Now test)
	int **s = new int*[count];
	for (i=0;i<count;i++) for (j=0;j<count;j++) s[i][j]=0;
	MatrixCreator(s, count, circle);
	printf("\n");
	for (i=0;i<count;i++) {for (j=0;j<count;j++) if (i!=j)printf(" %i",s[i][j]); else printf(" °"); printf("\n");};
	///////////
	getch();
//	int *mas=new int[count];

  //	Vibor(s,0,mas,&w, count);
	printf("\n");
	getch();
    //	for (i=0;i<w;i++) printf("%i ", mas[i]);
      //	getch();
	///////////
	return 0;
}
файл Proc.cpp
Код:
//Declaring new data type
struct CIRCLE {
    float x, y, r;
    char crossflag;
};
int j1, k1,l;
/////////////////////////
//Folloving we'll have dinamic array of one
/*******************************Opening file****************************/
FILE *FOpen(char *path, char *reg)
{
	FILE *name;
	if ((name = fopen(path,reg))!=NULL) return name;
	printf("Unable to open file '%s'",path);
	return NULL;
}
/*Tests crossing of 2 circles*/
int test(CIRCLE c1,CIRCLE c2)
{
	//printf("%i %i %i %i %i %i", c1.x, c1.y, c1.r, c2.x, c2.y, c2.r);
	if ( sqrt( (fabs(c1.x-c2.x)*fabs(c1.x-c2.x))+(fabs(c1.y-c2.y)*fabs(c1.y-c2.y)))  <(c1.r+c2.r)) return 1;
	return 0;
}
/////
int test2(CIRCLE c1, CIRCLE c2)
{
	if (((sqrt( ((c1.x-c2.x)*(c1.x-c2.x))+((c1.y-c2.y)*(c1.y-c2.y)))+c1.r)<c2.r)||( (sqrt( ((c1.x-c2.x)*(c1.x-c2.x))+((c1.y-c2.y)*(c1.y-c2.y)))+c2.r)<c1.r))
	return 0;
	return 1;
}
int MatrixCreator(int **s, int n, CIRCLE *circle)
{
	int i2,j2,k2;
	for (i2=0;i2<n;i2++)
		for (j2=0; j2<n; j2++)
			if(i2!=j2)
			 if (test (circle[i2],circle[j2]))
			  if (test2(circle[i2],circle[j2])) s[i2][j2]=5    ;

	for (i2=0;i2<n;i2++)
		for (j2=0;j2<n;j2++)
			for (k2=0;k2<n;k2++)
				if (i2!=j2)
				 if(s[k2][i2] && s [j2][k2])
				  s[j2][i2]=4;
//        for (i2=1;i2<n;i2++) for (j2=1; j2<n; j2++) s[n-j2][i2]= s[i2][n-j2];
return 0;
}
 int Vibor(int **s, int i, int *mas, int*w, int n)
 {
	for (j1=0;j1<n;j1++)
		///for(k1=0;k1<n;k1++)
		///	if(!s[j1][k1])
		///		{
		///			mas[*w++]=k1;
		///			Vibor(s,k1,mas,w,n);
		///		}
		k1=1;
		for(l=0;l<*w;l++)
		if (j1==mas[l]) k1=0;
		if ((!k1)||(s[i][j1]==0))
		{       *w++;
			mas[*w]=j1;
			Vibor(s,j1,mas,w,n);

		}
 }
строки закамментеного кода - результат вычленения ошибок...
Пришел к выводу - матрица связей портится еще в момент создания, ибо я ее транспонировал и получил интересные результаты)

Вопрос: как бы это сделать чтобы не шло неверное обращение к этой матрице)
EniOk вне форума Ответить с цитированием
Старый 22.06.2009, 00:45   #20
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

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

Ошибка доступа возникает тут:
Код:
int **s = new int*[count];
for (i=0;i<count;i++) for (j=0;j<count;j++) s[i][j]=0;
потому что нужно выделить память под каждую строку:
Код:
int **s = new int*[count];
for(i=0; i<count; i++)
 s[i] = new int[count];
for (i=0;i<count;i++) for (j=0;j<count;j++) s[i][j]=0;
И также не забывайте освобождать память!

Добавьте где-нибудь в конце
Код:
for(i=0; i<count; i++)
 delete[] s[i];
delete[] s;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странная задача ARF_name Паскаль, Turbo Pascal, PascalABC.NET 1 29.04.2009 11:24
Странная загрузка Лубышев Операционные системы общие вопросы 9 17.03.2008 09:24
Не вижу ошибку...помогите. 1 курс задача на Си good_andy Помощь студентам 6 02.01.2008 10:01
Странная реакция drknn Помощь студентам 2 02.09.2007 15:51
Странная ошибка Washington БД в Delphi 2 16.03.2007 18:13