Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

In tất cả dãy序列 (sequences) độ dài cho trước trong C++


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