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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2010, 10:55   #1
Fog
Пользователь
 
Аватар для Fog
 
Регистрация: 29.08.2010
Сообщений: 76
По умолчанию Алгоритм перебора символов

Друзья подскажите по какому алгоритму можно перебрать
все возможные комбинации символов находящихся в массиве.
Допустим дан массив:
char array[3]={'a','b','c','d'};
как теперь можно записать в файл все возможные перестановки этих
знаков(abcd,bacd,cbda...)?.Очевидно по комбинаторике здесь количество перестановок равно 4! = 24 но вот как в цикле их перебрать.Вот кусок моего кода:
------------------------------------------------------------------------
Код:
ofstream ofs();
ofs.open("c:\\perebor.txt",ios::app);
int i=0;
char array[3]={'a','b','c','d'};
while(i<24){
  for(int j=0;j<4;j++){
   ofs<<array[j];
 }
  ofs<<"\n";
  change_comb(array,4);//вот эту ф-ю надо придумать
  i++;
}
void change_comb(char* array,int size){
 ?????????????????????????????????????
}
-----------------------------------------------------------
Заранее спасибо.

Последний раз редактировалось Stilet; 27.09.2010 в 12:42.
Fog вне форума Ответить с цитированием
Старый 25.09.2010, 17:18   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Пригодится? http://www.programmersforum.ru/showthread.php?t=112944
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 25.09.2010, 18:19   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Если нет цели писать алгоритм самому, то
Код:
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
	char a[] = "abcd";
	char *b = a, *e = a + strlen(a);
	do
	{
		cout << a << endl;
	} while (next_permutation(b, e));
	cin.sync();
	cin.peek();
}
Somebody вне форума Ответить с цитированием
Старый 26.09.2010, 23:20   #4
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

Лучше так.
Код:
int fact(int n)
{
	if(n==0 || n ==1)
		return 1;
	return n * fact(n-1);
}
int main()
{
	char a[] = "abcd";
	char *b = a, *e = a + strlen(a);
	for(int i = 0; i<fact((sizeof(a)-1)/sizeof(a[0])); i++)
	{
		cout << a << endl;
		next_permutation(b,e);
	};
	cin.sync();
	cin.peek(); 
	return 0;
}
sashonk вне форума Ответить с цитированием
Старый 27.09.2010, 00:32   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

наоборот хуже, например при n = 12 ваша программа уйдет в бесконечный цикл
зачем такие извращения?
Код:
(sizeof(a)-1)/sizeof(a[0]))
man strlen
NiCola999 вне форума Ответить с цитированием
Старый 27.09.2010, 12:14   #6
Fog
Пользователь
 
Аватар для Fog
 
Регистрация: 29.08.2010
Сообщений: 76
По умолчанию

Спасибо понял.
Fog вне форума Ответить с цитированием
Старый 27.09.2010, 21:48   #7
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

Цитата:
наоборот хуже, например при n = 12 ваша программа уйдет в бесконечный цикл
Возможно, это и не лучший вариант, но это ответ на предыдущий код, в котором все возможные комбинации будут перебраны только для последовательности "abcd". Для другой последовательности функция next_permutation вернет меньше перестановок.
PS ничего не имею против strlen

Да, наверно, вы правы. Пожалуй, как-нибудь так лучше будет
Код:
int main()
{
	
	char a[] = "dbca";
	char r[sizeof(a)];
	strcpy(r, a);
	char *b = a, *e = a + strlen(a);
	do
	{
		cout << a << endl;
		next_permutation(b,e);
	}while(strcmp(a,r)!=0);
	
	cin.sync();
	cin.peek(); 

	return 0;
}

Последний раз редактировалось sashonk; 27.09.2010 в 22:05.
sashonk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм перебора (Delphi) Air Помощь студентам 11 20.07.2008 20:28