Помогите пожалуста
задание
Перечислить все возростающие последовательности длины k из чисел 1....n в лексографическом порядке. (Пример
при n=5, k=2 получаєм 12 13 14 15 23 24 25 34 35 45)
Решение
Минимальной будет последовательность (12...k); максимальной ((n-k+1)...(n-1)n). s-й член последовательности можна увеличивать если он меньше n-k+s. После увеличения s-го элемента все следующие должны возростать с шагом 1.
Алгоритм
s:=n;
while not (x[s]<n-k+s) do begin
{
s:=s-1;
}
end;
// s - номер єлемента подлежащего увеличению
x[s]:=x[s]+1;
for i := (s+1) to n do begin
{
x :=x[i-1]+1;
}
end;
програма з числами
Код: Выделить всё
/*Перечислить все возрастающие последовательности длины k из чисел 1....n в лексикографическом порядке*/
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
void f(int n,int k,int t, char s[255],int st){
int i;
if(!k){
s[t]=0;
cout<<s<<endl;
}
else
for(i=st;i<=n;i++){
s[t]=48+i;
f(n,k-1,t+1,s,i+1);
}
}
int main(){
int n,k;
char *buff;
buff=new char[255];
cout<<"k: ";
cin>>k;
cout<<"n: ";
cin>>n;
f(n,k,0,buff,1);
cout<<endl<<"press <enter> to continue: ";
cin.get(),cin.get();
return 0;
}
Возрастающие и лексикографический
Приглашаю на свой блог о программировании: pro-prof.com