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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2010, 22:04   #1
3Gun
Новичок
Джуниор
 
Регистрация: 10.12.2010
Сообщений: 3
По умолчанию работа с матрицами

У меня такая проблема. Необходимо подсчитать определитель матрицы NxN
методом перестановок.
как сам определитель считается я разобрался: сумма произведений эл-ов взятых по одному из каждой строки и столбца. и вот здесь начинаются проблемы....

необходимо написать фун-ю которая будет перебирать все комбинации элементов (от 1 до n), т е 123; 132; 321 и тд.

помогите плиз! буду благодарен даже за алгоритм действий

за ранее спасибо
3Gun вне форума Ответить с цитированием
Старый 10.12.2010, 22:16   #2
3Gun
Новичок
Джуниор
 
Регистрация: 10.12.2010
Сообщений: 3
По умолчанию

вот код функции которую взял из учебника, но она рекурсивная да еще и не работает
Код:
void Permute(int permlist[], int start, int n)
{
   int tmparr[UpperLimit];
   int tmp,i,j=0;

   if (start==n-1) //условие остановки: достигнут последний эл-т
     {
      for (i=0; i<n; i++)
         {
          Form1->StringGrid1->Cells[i][j]=permlist[i];
         }
      j++;
      Form1->Panel1->Caption="Det="+FloatToStrF(t,ffGeneral,5,5);
     }
   else //шаг рекурсии: поменять местами permlist[start] и permlist[i]
        //скопировать массив в tmparr и переместить эл-ты tmparr от start+1 до конца
       {
        for (i=start; i<n; i++)
           {
            tmp=permlist[i];
            permlist[i]=permlist[start];
            permlist[start]=tmp;

            Copy(tmparr, permlist, n);
            t++;
            Permute(tmparr, start+1, n);
           }
       }

}
3Gun вне форума Ответить с цитированием
Старый 10.12.2010, 22:17   #3
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
необходимо написать фун-ю которая будет перебирать все комбинации элементов
Язык какой, C++? Можно ли использовать библиотеки?
Если оба ответа утвердительны, вам подойдет:
Код:
#include <list>
#include <algorithm>

void funct(const int n)
{
      list<int> lst(n);
      for(list<int>::iterator bi_iter = lst.begin(), int i = 1; bi_iter != lst.end(); bi_iter++, i++)
            *bi_iter = i;
      while(next_permutation(lst.begin(), lst.end()))
      { // Some code ... }
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 10.12.2010, 22:28   #4
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Я конечно не выпячиваю свое я (хотя нет всетаки выпячиваю) Но первый раз слышу про определитель который вычисляется методом перестановок.
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
	int a[3][3]={1, 2, -2, 2, 1, -1, 3, 1, 4}, det;

	for (int i=0; i<3; i++)
	{
		for (int j=0; j<3; j++)
		{
			cout<<a[i][j]<<"\t";
		}
		cout<<"\n";
	}

	det=a[0][0]*a[1][1]*a[2][2]

	+a[2][0]*a[0][1]*a[1][2]

	+a[1][0]*a[2][1]*a[0][2]

	+(-1)*(a[2][0]*a[1][1]*a[0][2]

	+a[1][0]*a[0][1]*a[2][2]

	+a[2][1]*a[1][2]*a[0][0]);

	cout<<"\n"<<"Determinant = "<<det<<"\n";
	
	return 0;
}
Я конечно человек малообразованый но вот по моему можно посчитать определитель.
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 10.12.2010, 22:52   #5
3Gun
Новичок
Джуниор
 
Регистрация: 10.12.2010
Сообщений: 3
По умолчанию

а может кто нибудь помочь переделать рекурсивную функцию
Код:
void Permute(int permlist[], int start, int n)
{
   int tmparr[UpperLimit];
   int tmp,i,j=0;

   if (start==n-1) //условие остановки: достигнут последний эл-т
     {
      for (i=0; i<n; i++)
         {
          Form1->StringGrid1->Cells[i][j]=permlist[i];
         }
      j++;
      Form1->Panel1->Caption="Det="+FloatToStrF(t,ffGeneral,5,5);
     }
   else //шаг рекурсии: поменять местами permlist[start] и permlist[i]
        //скопировать массив в tmparr и переместить эл-ты tmparr от start+1 до конца
       {
        for (i=start; i<n; i++)
           {
            tmp=permlist[i];
            permlist[i]=permlist[start];
            permlist[start]=tmp;

            Copy(tmparr, permlist, n);
            t++;
            Permute(tmparr, start+1, n);
           }
       }

}
так что бы она работала
3Gun вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19
Работа с матрицами Vladimir-888 Помощь студентам 2 21.06.2010 06:51
C++ работа с матрицами. Farsait Общие вопросы C/C++ 2 19.01.2010 02:57
Работа с матрицами на Си artem7213 Общие вопросы C/C++ 5 21.04.2009 14:37