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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2016, 08:18   #11
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Делал не себе, поэтому делал тяп-ляп. Протестируй программу хорошенько.
У меня получилось не компактно (вспомни, как ты представляла себе решение), может и есть возможность уменьшить код... Но мне лень его искать... Главное: общее направление я дал куда копать, а дальше сама.
И ещё одно: я ввёл массив int mas1[200]; обрати на это внимание.

Код:
#include <iostream>
using namespace std;

int n = 7, k = 4;
bool mas[200];

void func(int lst, int cnt)
{
	if (cnt == k)
	{
		for (int i = 0; i <n; i++)
		{
			if (mas[i])
			{
				cout << i + 1 << " ";
			}
		}
		cout << endl;
		return;
	}

	if (lst + 1 >= n)
	{
		return;
	}

	mas[lst + 1] = true;
	func(lst + 1, cnt + 1);

	mas[lst + 1] = false;
	func(lst + 1, cnt);
	return;
}

int mas1[200];

int main()
{
	cout << "||||||||||| func(-1, 0); |||||||||||||||||\n";
	func(-1, 0);
	cout << "|||||||||||||||||||||||||||||||||||||||||||\n";

	int home, end;
	for (int i = 1; i <= n - k + 1; i++)
	{
		for (int j = 0; j < k; j++)
		{
			mas1[j] = i + j;
			cout << i + j << " ";
		}
		cout << "\n";
		home = 1;
		end = k - 2;
		while (true)
		{		
			if (mas1[home] == n - 1)
			{
				break;
			}	
			if (mas1[home] == n - k + 1 + home)
			{
				home++;
				continue;
			}

			cout << mas1[0] << " ";
			for (int j = 1; j < k; j++)
			{
				if ((mas1[j] < (n - k + 1 + j)) && (j + 1 < k) && (mas1[j + 1] < (n - k + 1 + j + 1)))
				{
					cout << mas1[j] << " ";
					continue;
				}
				if ((mas1[j] < n) && (j + 1 == k))
				{
					mas1[j] = mas1[j] + 1;
					cout << mas1[j] << " ";
					continue;
				}
				// корректировка mas1[]	
				if (mas1[end] < n - k + 1 + end)
				{
					mas1[end] = mas1[end] + 1;
					cout << mas1[end] << " ";
					for (int g = end + 1; g < k; g++)
					{
						mas1[g] = mas1[g - 1] + 1;
						cout << mas1[g] << " ";
					}
					break;
				}
				if (mas1[end] == n - k + 1 + end)
				{
					end--;
					if (end == home)
					{
						if (mas1[end] < n - k + 1 + end)
						{
							mas1[end] = mas1[end] + 1;
							cout << mas1[j] << " ";
							for (int g = end + 1; g < k; g++)
							{
								mas1[g] = mas1[g - 1] + 1;
								cout << mas1[g] << " ";
							}
							end = k - 2;
							if (mas1[home] == n - k + 1 + home)
							{
								home++;
							}
							break;
						}
						if (mas1[end] == n - k + 1 + end)
						{
							home++;
							end = k - 2;							
						}
					}
				}
			}
			cout << " \n";
		}
	}
	system("pause");
	return 0;
}

135.jpg

Последний раз редактировалось ura_111; 05.10.2016 в 08:26.
ura_111 вне форума Ответить с цитированием
Старый 06.10.2016, 10:14   #12
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

код не проверял
Код:
// ЭАМЕТИМ что каждое последующее число в последовательностти СТРОГО БОЛЬШЕ предыдущего

// это массив на сколько следующее число в записи последовательности больше предыдущего
int mas2[200]; // использовать будем первые k+1 { 0 ... k }
первая последовательность  1 2 3 4 ... k
заполнение для этой посл.   1 1 1 1 ... 1 {и еще n }

итерация заключается 
1. в увеличении крайне правого на 1 если он меньше максимально допустимого(<n) 
2. и установка  всех следующих за ним в минимальную позицию (=1)

в результате НЕ ВО ВСЕХ итерациях получаются допустимые значения.
 1 n 1 1 1 1 -- уж точно недопустима!

for (j=0;j<k;j++)
{
   mas2[j]=n; // чтобы сразу сбросить 
}
mas2[0]=0; // чтобы войти в цикл выполнить итерацию(увеличение нулевого и +1 получить в итоге 1
  

while (mas2[0]<n) // может можно даже ( mas2[0]<n-k ) 
{
   mas2[k] =n;// чтобы гарантированно увеличить последний из нужных нам для вывода 0 ... k-1 
   r =0;
   f =(mas2[0]<n); //индикатор true - мы все еще можем наращивать 
                   // false - на каком-то шаге мы "вышли" за n (получили НЕДОПУСТИМУЮ последовательность)
                   //  теперь надо все последующие сбросить до 1
   for (j=1;j<=k;j++)// начинам с первого (а НЕ нулевого) чтобы МОЧЬ работать c j-1(тем самым нулевым)
//  и используем "лишний"(j==k)
//         как постояный "барьер" {mas2[k] =n в начале while} 
//         и для доступа к последнему mas2[j{==k} -1]
   {  
      if ( (!f) || (r +mas2[j] >=n) ) 
      {
        mas2[j-1]=mas[j-1] +1; // наращиваем всегда предыдущий (именно поэтому нам и был нужен mas2[k] =n;
        mas2[j] =0; // сначала сделаем 0, чтобы ПОСЛЕ (на следующей интрации цикла)
                    // получить как mas2[j-1] и +1  
        f =false; // ВСЕ теперь для последующих будем делать только сброс в 0 и затем +1
      } 
      r =r +mas[j-1]; // считаем сумму ВСЕХ прошедщих (это будет число выводимое на данной позиции)
   }  

   if (r<=n) // удачно последнее число <=n
   { 
      //выводим ПОЛУЧЕННУЮ(имеющуюся у нас mas2) последовательность
      r=0; //для определения ВЫВОДИМОГО на позиции j нам нужна СУММА элементов 0 ... j 
      for (j=0;j<k;j++)
      {
         r =r+mas[j]; // она у нас теперь есть
         cout<<r<<" "; // выводим !!!
      }
      cout<<endl;
   }
}
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.10.2016 в 10:25.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с задачей по рекурсии: массив 1..N. с N переход на позицию N + 1 или N + 5. Определить с помощью рекурсии можно ли собрать сумму чисел K polsovatel C# (си шарп) 2 22.09.2016 02:52
Цикл For next делает только одну итерацию jirtreck Microsoft Office Excel 4 30.10.2015 16:56
Переделать рекурсию в итерацию в QBasic Abimeleh Помощь студентам 0 04.07.2015 22:42
маленькая задача на простую итерацию Генна Помощь студентам 0 02.04.2012 18:45
Перевод из рекурсии на итерацию Anubys Помощь студентам 0 18.04.2011 18:12