Bài toán lập số từ các chữ số

Cho e hỏi bài này code như thế nào ạ?
Nhập 4 chữ số bất kì từ bàn phím. Hỏi có tất cả có bao nhiêu chữ số tự nhiên có
bốn chữ số khác nhau mà mỗi số có đủ bốn chữ số đã cho ? Viết chương trình liệt kê và
đếm các số trên

1 Like

Em tìm hiểu bài toán: “liệt kê hoán vị c++”

Lưu ý nếu người dùng nhập số 0 nhé.

3 Likes

Vậy nhập hai chữ số 6 thì ntn :smiley:

5 Likes

Chuyển nó về lưu mảng nhé bạn, khi đó chỉ số sẽ không trùng lặp

Sau đó thực hiện bài toán trên chỉ số. Xong rồi thì map lại với giá trị của mảng là được

Mình bổ sung luôn hướng dẫn cho bài toán liệt kê hoán vị ở blog của mình

https://nguyenvanhieu.vn/liet-ke-cac-hoan-vi/

4 Likes

Bài này, toán bạn làm ntn thì lập trình cứ thế mà theo :confused:

Khá ổn rồi đại ca. Nhưng e thấy vẫn chưa giải quyết đc vấn đề khi phập 2 hay nhiều số giống nhau.
Vd như khi nhập 122 và chuyển sang một mảng ghi là B[], rồi sửa A[i] = i thành A[i] = B[i], và theo thuật toán của anh, tất cả các lần nó xuất ra sẽ là:

1 2 2
1 2 2
2 1 2
2 2 1
2 1 2
2 2 1

Theo e nghĩ là nên thêm một map C[] rồi lưu những giá trị đã xuất vào đó. Lần xuất tiếp theo sẽ kiểm tra xem trong map có giá trị đó chưa rồi mới xuất. :slightly_smiling_face:

1 Like

Cách này không ổn đâu bạn :))
Việc lập phải có một thứ tự nhất định, từ một cấu hình phải tính được cấu hình tiếp theo hoặc xác định được đó có phải là cấu hình cuối cùng không. Chứ giả sử có tổng cộng 1 triệu hoán vị mà lưu mảng, mỗi lần ra hoán vị đều duyệt thì hết ngày.

4 Likes

Vậy đại ca có ý tưởng nào để fix lỗi trên. (Nhập nhiều chữ số như nhau á)

Thế thì vi phạm đề bài, bài yêu cầu liệt kê các số tự nhiên có 4 chữ số khác nhau mà người dùng nhập 4 chữ số không khác nhau thì cứ báo lỗi thôi :slight_smile:

2 Likes

À không, ý e là mở rộng ra cơ. Còn chỉ khác nhau thôi thì đơn giản quá. :smile:

2 Likes

Sao phức tạp thế em. Giả sử input là

1 2 2 2 2 2

Em cứ thêm vào cuối mảng, giả sử mảng a nhé. Khi đó:

a[] = {1 2 2 2 2 2}

Như vậy, em giúp mình liệt kê hoán vị các chỉ số của mảng này, là các số:

0 1 2 3 4 5

Với mỗi hoán vị chỉ số liệt kê được, map lại theo chỉ số mảng. Giả sử có một hoán vị là:

0 1 2 3 5 4
=> Kết quả của hoán vị là: a[0] a[1] a[2] a[3] a[5] a[4]
// làm tương tự với các hoán vị còn lại, nếu map xong một hoán vị mà có phần tử đầu tiên có giá trị 0 thì bỏ qua.

À không, ý e nói là nếu hai hoán vị khác nhau nhưng cho cùng 1 số giống nhau thì không cho vào map thôi.
Như vd trên của anh thì
a[0]a[1]a[2]a[3]a[4]a[5] = 122222
a[0]a[1]a[2]a[3]a[5]a[4] = 122222
Tuy là 2 hoán vị khác nhau nhưng cùng chỉ đến một số thì không nên cho vào map.
Ý e là zậy á. :smile:

2 Likes

Ah ừ nhỉ, cái này dùng map hoặc set sẽ giải quyết được :smiley:

2 Likes

Dùng pp sinh sẽ dễ hơn vì lấy luôn được phần tử tiếp theo.

VD: 1322 -> 2123 -> 2132 -> 2213
O[0…] = [1, 2, 2, 3, 3] -> O’[0…2] = [[‘1’, 1], [‘2’, 2], [‘3’, 2]]
P[0…4] = “12233” -> ?
‘3’ -> O’[2] max
‘2’ -> chưa max, swap P[2] với P[3] -> 12323
Đảo ngược phía sau đuôi và chèn.

4 Likes

Phương pháp sinh của bài này, chắc là kiểm tra dãy tăng giảm:
1322, đoạn cuối cùng có tăng là 1 → 3, vậy 1 có thể tăng lên
Số cuối cùng sau số 1 này lớn hơn 1 là 2, vậy 1 sẽ tăng thành 2
Xếp 2 vào vị trí của 1, phần còn lại sắp xếp tăng dần, vậy ta có 2123

2123, đoạn cuối cùng có tăng là 2 → 3, vậy 2 có thể tăng lên
Số cuối cùng sau só 2 này lớn hơn 2 là 3, vậy 2 sẽ tăng thành 3
Xếp 3 vào vị trí của 2, phần còn lại có 1 chữ số nên thôi, khỏi sắp xếp, ta có 2132

3 Likes

@Sherly1001

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