Hỏi về bài toán liệt kê bằng phương pháp sinh

Chào các bác, em học về bài toán sinh đang làm 1 bài tập như này:

Cho một hình chữ nhật gồm mxn hình vuông
đơn vị. Hãy liệt kê tất cả các đường đi từ đỉnh cuối của ô
vuông cuối cùng phía bên trái đến đỉnh đầu của ô vuông
trên cùng phía bên phải. Biết mỗi bước đi chỉ đuợc phép
dịch chuyển sang bên phải hoặc lên trên theo các cạnh
của hình vuông đơn vị.

Em code bằng c++ để liệt kê các cấu hình như sau:

//sinh day nhi phan co m so 1 va n so 0
#include <iostream>
using namespace std;

int m,n;

void init(int a[],int mSize);//sinh cau hinh dau tien
void display(int a[], int mSize);//Hien thi cac cau hinh
bool isFinal(int a[], int mSize);//Check cau hinh
void genNext(int a[],int mSize);//Sinh cau hinh tiep theo
void output(int a[], int mSize);//Hien thi cau hinh dang nhi phan
int mPow(int n);//Tinh 2 mu n

int main(){
    cout<<"m = ";
    cin>>m;
    cout<<"n = ";
    cin>>n;
    int mSize = m+ n;
    int a[mSize];
    init(a,mSize);
    int x = mPow(mSize);
    cout<<x<<endl;
    int count= 0;
    for(int i = 0;i<x;i++){
        genNext(a,mSize);
        if(isFinal(a,mSize)){
            output(a,mSize);
            display(a,mSize);
            count++;
        }
       
    }
    cout<<endl<<count<<endl;
    return 0;
}

void init(int a[],int mSize ){
    for(int i = 0;i<mSize;i++){
        a[i] = 0;
    }
}

void display(int a[],int mSize){
    for(int i = 0;i<mSize;i++){
        if(a[i]==1) cout<<"➜"<<" ";
        else cout<<"↑"<<" "; 
    }
    cout<<endl;
}

void output(int a[],int mSize){
    for(int i = 0;i<mSize;i++){
        cout<<a[i];
    }
    cout<<endl;
}

bool isFinal(int a[],int mSize ){
    int sum = 0;
    for(int i = 0;i<mSize;i++){
        sum += a[i];
    }
    return (sum==m);
}

void genNext(int a[], int n){
    int i = n-1;
    while(a[i] == 1){
        a[i]=0;
        i--;
    }
    a[i] = 1;
}

int mPow(int n){
    int res = 1;
    for(int i = 0;i<n;i++) res*=2;
    return res;
}

Em chạy chương trình vẫn ra đủ cấu hình nhưng bị lỗi Segmentation fault như bên dưới

000111
↑ ↑ ↑ → → → 
001011
↑ ↑ → ↑ → → 
001101
↑ ↑ → → ↑ → 
001110
↑ ↑ → → → ↑ 
010011
↑ → ↑ ↑ → → 
010101
↑ → ↑ → ↑ → 
010110
↑ → ↑ → → ↑ 
011001
↑ → → ↑ ↑ → 
011010
↑ → → ↑ → ↑ 
011100
↑ → → → ↑ ↑ 
100011
→ ↑ ↑ ↑ → → 
100101
→ ↑ ↑ → ↑ → 
100110
→ ↑ ↑ → → ↑ 
101001
→ ↑ → ↑ ↑ → 
101010
→ ↑ → ↑ → ↑ 
101100
→ ↑ → → ↑ ↑ 
110001
→ → ↑ ↑ ↑ → 
110010
→ → ↑ ↑ → ↑ 
110100
→ → ↑ → ↑ ↑ 
111000
→ → → ↑ ↑ ↑ 
Segmentation fault

Các bác các chú các ông các anh các chi có thể cho em hỏi em đang sai chỗ nào không ạ ? Em cảm ơn ạ :V

1 Like

Edit lại là em thử dùng cấp phát động và không gặp lỗi đấy nữa rồi, nhưng cho em hỏi là lúc nào em nên thu hồi bộ nhớ ạ ? Nếu em không thu hồi thì không hiện lỗi nhưng nếu thu hồi trước dòng return 0 thì lại gặp lỗi “double free or corruption (out) Aborted” ạ

1 Like

Thực ra bài này tương đương với sinh tổ hợp chập n thì đúng hơn :slight_smile:

3 Likes

Em thấy tổ hợp chập khó hơn tý :V

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?