Cho hai số nguyên k và n. In tất cả các dãy độ dài k từ các số 1 đến n theo thứ tự tăng dần.
Ví dụ:
Input: k = 2 ; n = 3 Output: 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3
Cách giải đơn giản: Tạo mảng kích thước k toàn giá trị 1. Lặp in và tăng dần như đếm trong hệ cơ số n.
Thuật toán
1) Tạo mảng kích thước k toàn giá trị 1.
2) Lặp in mảng và tăng giá trị cho đến khi mảng thành {n, n, ..., n}.
3) Tăng giá trị: kiểm tra phần tử cuối, nếu = n thì nhảy sang phần tử trước, v.v.
Chương trình minh họa (phi đệ quy)
#include <iostream>
using namespace std;
void printSequence(int arr[], int size){
for(int i = 0; i < size; i++)
cout << arr[i] << "\t";
cout << endl;
}
int nextElement(int arr[], int k, int n){
int s = k - 1;
while (arr[s] == n) s--;
if (s < 0) return 0;
arr[s] = arr[s] + 1;
for(int i = s + 1; i < k; i++)
arr[i] = 1;
return 1;
}
void generateSequence(int n, int k){
int *arr = new int[k];
for(int i = 0; i < k; i++) arr[i] = 1;
while(1){
printSequence(arr, k);
if(nextElement(arr, k, n) == 0) break;
}
}
int main(){
int n = 3, k = 2;
cout << "Dãy序列 là :\n";
generateSequence(n, k);
return 0;
}
Kết quả
1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3
Cách đệ quy hiệu quả hơn:
#include <iostream>
using namespace std;
void printSequence(int arr[], int size){
for (int i = 0; i < size; i++) cout << arr[i] << "\t";
cout << endl;
}
void generateSequence(int arr[], int n, int k, int index){
if (k == 0) { printSequence(arr, index); return; }
if (k > 0){
for (int i = 1; i <= n; ++i){
arr[index] = i;
generateSequence(arr, n, k - 1, index + 1);
}
}
}
int main(){
int n = 3, k = 2;
int *arr = new int[k];
cout << "Dãy序列 là:\n";
generateSequence(arr, n, k, 0);
return 0;
}
Kết quả
1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3