Thuật toán sinh hoán vị kế tiếp & tổ hợp lặp chập k của n phần tử [ Mô Phỏng ]

Chương trình mẫu in tất cả tổ hợp lặp chập k của n phần tử viết bằng C++:

‪#‎include‬ <iostream>
using namespace std;
int k , n ;
int a[100000] ;
void printResult() {
__for(int i =1 ; i <=k ; i++) {
____cout<<a[i]<<" " ;
__}
__cout<<endl ;
}
void sinh() {
__// sinh cấu hình đầu tiên
__for(int i =1 ; i <=k ; i++) {
____a[i] =1 ;
__}
__printResult() ;
__// sinh cấu hình tiếp theo
__ int j = k ;
__while(a[1]<n) {
____if(a[j]==n) {
______j-- ;
____}
____a[j]++ ;
____printResult() ;
__}
}
int main()
{
__cin>>k>>n ;
__if(k<0 || n < 0 ) {
____cout<<"Loi: k,n >0"<<endl ;
__}
__else {
____sinh() ;
__}
__return 0;
}

Thuật toán sinh hoán vị kế tiếp bằng C++:

#include <iostream>
#include <string>
using namespace std;
int main(){
__int test ;
__cin>>test ;
__for(int t= 0 ; t<test ; t++ ) {
______int stt ;
______string so;
______cin>>stt>>so;
______int i = so.size() -2 ;
____while (so[i] >= so[i+1]) {
______i-- ;
____}
____if(i== -1) {
______cout<<stt<<" BIGGEST" <<endl ;
____}
____else {
______int big = 0 ;
______char min = '9' ;
______int imin = i ;
______for(int k = i+1 ; k<so.size() ; k++) {
________if(so[k] > so[i] && so[k] <=min ) {
__________min = so[k] ;
__________imin = k ;
________}
______}
______// đổi chỗ 2 phần tử
______char temp = so[i] ;
______so[i] = so[imin] ;
______so[imin] = temp ;
______// gán lại giá trị cho chuỗi phía sau
______for(int k = i+1 ; k<so.size() -1 ; k++) {
________for(int j = k+1 ; j <so.size() ; j++) {
__________if(so[k] > so[j]) {
____________temp = so[k] ;
____________so[k] = so[j] ;
____________so[j] = temp ;
__________}
________}
______}
______cout<<stt<<" " <<so<<endl ;
____}
__}
__return 0;
}

Mô phỏng:

https://www.youtube.com/watch?v=408Ed8g-_jY

Ntech Developers

Programs must be written for people to read, and only incidentally for machines to execute.

Post a Comment

Previous Post Next Post