Các phần thì trong chương trình có nói cả rồi.
C Code:
  1. #include<conio.h>
  2. #include<stdio.h>
  3. #include<alloc.h>
  4. #include<dos.h>
  5. #define MAX 100
  6. #include<ctype.h>
  7. #include<D:\MAIN\8HAU.CPP>
  8. //=============================================================
  9.  float *B;
  10.  int *C;
  11.  void Init(int a[],int n){
  12.   int i;
  13.   for(i=1;i<=n;i++)
  14.   a[i]=i;
  15.   }
  16.  void View(int a[],int k){
  17.   int i;
  18.   for(i=1;i<=k;i++) printf("%3d",a[i]);
  19.   getch();
  20.   }
  21.  void ToHop_K_PhanTu(int a[],int n,int k){
  22.   int i,j,tmp;
  23.   static m=1;
  24.   printf("\n To hop thu %2d: ",m++);
  25.   View(a,k);
  26.   tmp=0;
  27.   for(i=1;i<=k;i++) if(a[i]!=n-k+i){tmp=1;break;}
  28.   if(tmp==0) return;//Da o to hop cuoi cung
  29.   i=k;
  30.   //Tim a[i] dau tien tu phai sang trai ma a[i]!=n-k+i
  31.   while(a[i]>=n-k+i)i--;
  32.   a[i]=a[i]+1;
  33.   for(j=i+1;j<=k;j++) a[j]=a[i]+j-i;
  34.   ToHop_K_PhanTu(a,n,k);
  35.   }
  36.  void TatCaTapCon(int a[],int n){
  37.   int k;
  38.   for(k=1;k<=n;k++){
  39.   Init(a,n);
  40.   printf("\n CAC TO HOP CO %d PHAN TU",k);
  41.   ToHop_K_PhanTu(a,n,k);
  42.   }
  43.   }
  44.  void SinhHoanVi(int b[],int a[],int n){
  45.   int i,k,r,s,tmp;
  46.   static m=1;
  47.   printf("\n Hoan vi thu %2d: ",m++);
  48.   for(i=1;i<=n;i++)
  49.      printf(" %3d",b[a[i]]);
  50.   tmp=0;
  51.   for(i=1;i<=n;i++)
  52.   if(a[i]!=n-i+1) { tmp=1;
  53.             break;
  54.             }
  55.   if(tmp==0) return;//Da o hoan vi cuoi cung
  56.   i=n-1;
  57.   //Tim a[i] dau tien tu phai sang trai ma a[i]<a[i+1]
  58.   while(a[i]>a[i+1])i--;
  59.   //Tim a[k] dau tien tu phai sang trai ma a[k]>a[i]
  60.   k=n;
  61.   while(a[k]<a[i]) k--;
  62.   //Doi cho a[k] va a[i]
  63.   tmp=a[i];
  64.   a[i]=a[k];
  65.   a[k]=tmp;
  66.   //Lat nguoc cac phan tu con lai
  67.   r=i+1;
  68.   s=n;
  69.   while(r<s){
  70.     tmp=a[r];
  71.     a[r]=a[s];
  72.     a[s]=tmp;
  73.     r++;
  74.     s--;
  75.     }
  76.     SinhHoanVi(b,a,n);
  77.     }
  78.   void HoanVi_K_PhanTu(int a[],int n,int k){
  79.   int i,j,tmp;
  80.   int b[MAX];
  81.   static m=1;
  82.   printf("\n To hop thu %3d: ",m++);
  83.   Init(b,k);
  84.   SinhHoanVi(a,b,k);
  85.   tmp=0;
  86.   for(i=1;i<=k;i++) if(a[i]!=n-k+i){tmp=1;break;}
  87.   if(tmp==0) return;//Da o to hop cuoi cung
  88.   i=k;
  89.   //Tim a[i] dau tien tu phai sang trai ma a[i]!=n-k+i
  90.   while(a[i]>=n-k+i) i--;
  91.   a[i]=a[i]+1;
  92.   for(j=i+1;j<=k;j++) a[j]=a[i]+j-i;
  93.   HoanVi_K_PhanTu(a,n,k);
  94.   }
  95. // Duyet cac cach chia n
  96. int Next_Division(int &k,int C[]){
  97.  int i,j,R,S,D;
  98.  i=k;
  99.  while(i>0&&C[i]==1) i--;
  100.  if(i>0){
  101.           C[i]=C[i]-1;
  102.           D=k-i+1;
  103.     R=D/C[i];
  104.     S=D%C[i];
  105.     k=i;
  106.     if(R>0){
  107.     for(j=i+1; j<=i+R; j++)
  108.                 C[j] = C[i];
  109.             k = k+R;
  110.         }
  111.         if(S>0){
  112.             k=k+1; C[k] = S;
  113.         }
  114.     }
  115.     else return 0;
  116.     return 1;
  117.  }
  118.   int KiemTra(int C[],int k){
  119.   int i=k;
  120.   while(C[i]==1) i--;
  121.   if(i==0) return 1;
  122.    else return 0;
  123.   }
  124.   void Division(int n){
  125.   int k,i,count,C[MAX];
  126.   k=1;
  127.   count=1;
  128.   C[k]=n;
  129.   while(1){
  130.   printf("\n Cach chia thu %3d : ",count++);
  131.   for(i=1;i<=k;i++) printf(" %3d",C[i]);
  132.   if(KiemTra(C,k)==1) return;
  133.   Next_Division(k,C);
  134.    }
  135.  }
  136. //Duyet cac bo gia tri roi rac
  137. void Init(int &n,int &k,int H[]){
  138.     int i,j;
  139.     float x;
  140.     C[0]=0;
  141.     H[0]=0;
  142.     FILE *fp;
  143.     fp=fopen("roirac.in","r");
  144.     fscanf(fp,"%d",&n);
  145.     for(i=1;i<=n;i++)
  146.      fscanf(fp,"%d",&H[i]);
  147.     k=0;
  148.     for (i=1; i<=n; i++){
  149.         printf("\n");
  150.         for(j=1; j<=H[i]; j++){
  151.             fscanf(fp,"%f",&x);
  152.             B[++k]=x;
  153.         }
  154.     }
  155.     fclose(fp);
  156. }
  157. int In_Set(int i,int H[]){
  158.     int canduoi=0, cantren=0,j;
  159.     for(j=1; j<=i; j++)
  160.         cantren = cantren + H[j];
  161.     canduoi=cantren-H[j-1];
  162.     if (C[i]> canduoi && C[i]<=cantren)
  163.         return 1;
  164.     return 0;
  165. }
  166. void Result(int count,int n){
  167.     int i;
  168.     printf("\n Tap con thu %3d:",count);
  169.     for(i=1; i<=n ; i++){
  170.         printf("%8.2f", B[C[i]]);
  171.     }
  172. }
  173. void Try(int i,int k,int n,int H[]){
  174.     int j;
  175.     static count=1;
  176.     for(j = C[i-1]+1; j<=(k-n+i); j++){
  177.         C[i]=j;
  178.         if(In_Set(i,H)){
  179.             if (i==n)  Result(count++,n);
  180.             else Try(i+1,k,n,H);
  181.         }
  182.     }
  183. }
  184. void CacBoRoiRac(){
  185.     int n,k,H[MAX];
  186.     B = (float *) malloc(MAX *sizeof(float));
  187.     C = (int *) malloc(MAX *sizeof(int));
  188.     Init(n,k,H);
  189.     Try(1,k,n,H);
  190.     free(B);
  191.     free(C);
  192.     getch();
  193. }
  194. //****************************************************
  195. //Giai bai toan cai tui bang nhanh can
  196. int     x[MAX], xopt[MAX];
  197. float   fopt, cost, weight;
  198. //xopt la phuong an xu li do vat
  199. //fopt la tong gia tri do vat
  200. void Init(float A[],float C[], int &n, float &w){
  201.     int i;
  202.     FILE *fp;
  203.     fopt=0;
  204.     weight=0;
  205.     fp=fopen("caitui.in","r");
  206.     if(fp==NULL){
  207.         printf("\n Khong co file input");
  208.         delay(2000); return;
  209.     }
  210.     fscanf(fp,"%d %f",&n,&w);
  211.     for(i=1; i<=n;i++) xopt[i]=0;
  212.     printf("\n\n So luong do vat %2d", n);
  213.     printf("\n\n Gioi han tui %8.2f", w);
  214.     printf("\n\n Vecto gia tri su dung:");
  215.     for(i=1; i<=n; i++) {
  216.         fscanf(fp,"%f", &C[i]);
  217.         printf("%8.2f", C[i]);
  218.     }
  219.     printf("\n\n Vector trong luong:   ");
  220.     for(i=1; i<=n; i++){
  221.         fscanf(fp,"%f", &A[i]);
  222.         printf("%8.2f", A[i]);
  223.     }
  224.     fclose(fp);
  225. }
  226. void swap(int n){
  227.     int i;
  228.     for(i=1; i<=n; i++)
  229.         xopt[i]=x[i];
  230. }
  231. void Update_Kyluc(int n){
  232.     if(cost>fopt){
  233.         swap(n);
  234.         fopt=cost;
  235.     }
  236. }
  237. void Try(float A[], float C[], int n, float w, int i){
  238.     int j, t=(w-weight)/A[i];
  239.     for(j=t; j>=0;j--){
  240.         x[i]=j;
  241.         cost = cost + C[i]*x[i];
  242.         weight = weight + x[i]*A[i];
  243.         if(i==n) Update_Kyluc(n);
  244.         else if(cost + C[i+1]*(w-weight)/A[i+1]> fopt){
  245.             Try(A, C, n, w, i+1);
  246.         }
  247.         weight = weight-A[i]*x[i];
  248.         cost = cost-C[i]*x[i];
  249.  
  250.     }
  251. }
  252. void Result(int n){
  253.     int i;
  254.     printf("\n\n Gia tri do vat %8.2f", fopt);
  255.     printf("\n\n Phuong an toi uu:");
  256.     for(i=1; i<=n; i++)
  257.         printf("%3d", xopt[i]);
  258. }
  259. //*******************************************************
  260. //Giai bai toan Nguoi du lich bang phuong phap nhanh can
  261. int A[MAX], XOPT[MAX];
  262. void Read_Data(int &n,int C[][20]){
  263.     int i, j;FILE *fp;
  264.     fp = fopen("dulich.in","r");
  265.     fscanf(fp,"%d", &n);
  266.     printf("\n So thanh pho: %d", n);
  267.     printf("\n Ma tran chi phi:");
  268.     for (i=1; i<=n; i++){
  269.         printf("\n");
  270.         for(j=1; j<=n; j++){
  271.             fscanf(fp,"%d",&C[i][j]);
  272.             printf("%5d", C[i][j]);
  273.         }
  274.     }
  275. }
  276. int Min_Matrix(int n,int C[][20]){
  277.     int min=1000, i, j;
  278.     for(i=1; i<=n; i++){
  279.         for(j=1; j<=n; j++){
  280.             if (i!=j && min>C[i][j])
  281.                 min=C[i][j];
  282.         }
  283.     }
  284.     return(min);
  285. }
  286. void Init(int n,int &cmin,int &can,int &fopt,int C[][20]){
  287.     int i;
  288.     cmin=Min_Matrix(n,C);
  289.     fopt=32000;
  290.     can=0;
  291.     A[1]=1;
  292.     for (i=1;i<=n; i++)
  293.         B[i]=1;
  294. }
  295. void Result2(int n,int fopt){
  296.     int i;
  297.     printf("\n\n\n Hanh trinh toi uu %d:", fopt);
  298.     printf("\n Hanh trinh:");
  299.     for(i=1; i<=n; i++)
  300.         printf("%3d ->", XOPT[i]);
  301.     printf("%d",1);
  302. }
  303. void Swap(int n){
  304.     int i;
  305.     for(i=1; i<=n;i++)
  306.         XOPT[i]=A[i];
  307. }
  308. void Update_Kyluc(int n,int &can,int &fopt,int C[][20]){
  309.     int sum;
  310.     sum=can+C[A[n]][A[1]];
  311.     if(sum<fopt) {
  312.         Swap(n);
  313.         fopt=sum;
  314.     }
  315. }
  316. void Try(int i,int n,int cmin,int &fopt,int &can,int C[][20]){
  317.     int j;
  318.     for(j=2;j<=n;j++){
  319.         if(B[j]){
  320.             A[i]=j; B[j]=0;
  321.             can=can+C[A[i-1]][A[i]];
  322.             if (i==n) Update_Kyluc(n,can,fopt,C);
  323.             else if( can + (n-i+1)*cmin< fopt)
  324.                 Try(i+1,n,cmin,fopt,can,C);
  325.             B[j]=1;can=can-C[A[i-1]][A[i]];
  326.         }
  327.     }
  328. }
  329.  
  330.  
  331.  
  332.  
  333. //=============================================================
  334. void main()
  335. {
  336.  int k,n,a[MAX],chon;
  337.  float  A[MAX], C[MAX], w;
  338.  
  339.   clrscr();
  340.         textmode(C80);
  341.        textcolor(YELLOW);
  342.        textbackground(BLUE);
  343.        window(1,1,80,25);
  344.  while(1){
  345.  clrscr();
  346.  printf("Menu lua chon:\n");
  347.  printf("\n1- Duyet tat ca cac tap con");
  348.  printf("\n2- Duyet cac to hop k phan tu");
  349.  printf("\n3- Duyet cac hoan vi k phan tu");
  350.  printf("\n4- Duyet cac cach chia so tu nhien n");
  351.  printf("\n5- Duyet cac bo gia tri roi rac");
  352.  printf("\n6- Bai toan cai tui");
  353.  printf("\n7- Bai toan Nguoi du lich");
  354.  printf("\n8- Bai Toan 8 Hau");
  355.  printf("\nZ- Tro lai MENU chinh");
  356.  printf("\nHay chon chuc nang mong muon: ");
  357.  char  ch=toupper(getchar());
  358.     if(ch=='Z') break;
  359.  switch(ch){
  360.  case '1':
  361.     printf("\n Nhap n= ");
  362.     scanf("%d",&n);
  363.     TatCaTapCon(a,n);
  364.     break;
  365.  case '2':
  366.     printf("\n Nhap n va k: ");
  367.     scanf("%d%d",&n,&k);
  368.     Init(a,n);
  369.     printf("\n CAC TO HOP LA:\n");
  370.     ToHop_K_PhanTu(a,n,k);
  371.     break;
  372.  case '3':
  373.     printf("\n Nhap n va k: ");
  374.         printf("\nn=");scanf("%d",&n);
  375.         printf("\nk=");scanf("%d",&k);
  376.     Init(a,n);
  377.     HoanVi_K_PhanTu(a,n,k);
  378.         getch();
  379.     break;
  380.  case '4':
  381.     printf("\n Nhap n= ");
  382.     scanf("%d",&n);
  383.     Division(n);
  384.     getch();
  385.     break;
  386.  case '5':CacBoRoiRac();
  387.     break;
  388.  case '6':
  389.     Init(A,C,n,w);
  390.     Try(A,C,n,w,1);
  391.     Result(n);
  392.     getch();
  393.     break;
  394.  case '7':
  395.     int n,C[20][20],cmin,can,fopt;
  396.     Read_Data(n,C);
  397.     Init(n,cmin,can,fopt,C);
  398.     Try(2,n,cmin,fopt,can,C);
  399.     Result2(n,fopt);
  400.     getch();
  401.     break;
  402.  case '8':
  403.         T_HAU();
  404.  } //end switch
  405.  }//end while
  406.  }//end main

Còn bài toán Tám HẬU đây:
C Code:
  1. //Day la bai Toan 8_HAU no duoc chay tren Tep BAI7
  2. //#include <stdio.h>
  3. #include <stdlib.h>
  4. //#include <conio.h>
  5.  
  6. #define KICHTHUOC 8                    // Kich thuoc cua ban co
  7. #define SODUONGCHEO (2*KICHTHUOC-1)    // So duong cheo cua ban co
  8. #define SOGIA (KICHTHUOC-1)            // so gia
  9. #define TRUE 1
  10. #define FALSE 0
  11.  
  12. // prototypes
  13. void hoanghau(int);
  14. void inloigiai(int loigiai[]);
  15.  
  16. int cottrong[KICHTHUOC];          // mang cac cot co the dat hoang hau
  17. int cheoxuoitrong[SODUONGCHEO];   // mang cac duong cheo xuoi co the dat hhau
  18. int cheonguoctrong[SODUONGCHEO];  // mang cac duong cheo nguoc co the dat hhau
  19.  
  20. int loigiai[KICHTHUOC];        /* mang loigiai cho biet cot dat cac hoang
  21.                                              hau tren ban co. Vi du cac phan tu cua mang
  22.                                              la: 7   3   0   2   5   1   6   4
  23.                                              cho biet hoanghau0 dat o cot 7, hoanghau1
  24.                                              dat o cot 3, ..., hoanghau7 o cot 4      */
  25.  
  26. int SoLoiGiai = 0;
  27.  
  28. void T_HAU(void)
  29. {
  30.    int i;
  31.  
  32.    /* Khoi dong tat ca cac cot duong cheo xuoi, duong cheo nguoc deu co the
  33.       dat hoang hau */
  34.    for(i = 0; i < KICHTHUOC; i++)
  35.       cottrong[i] = TRUE;
  36.    for(i = 0; i < SODUONGCHEO; i++)
  37.    {
  38.       cheoxuoitrong[i] = TRUE;
  39.       cheonguoctrong[i] = TRUE;
  40.    }
  41.  
  42.    // Goi ham de qui de bat dau dat HoangHau0 (hoang hau o hang 0)
  43.    hoanghau(0);
  44. }
  45.  
  46. // Ham hoanghau giup dat hoang hau i (i tu 0 den KICHTHUOC-1) tren hang i
  47. void hoanghau(int i)
  48. {
  49.    int j;
  50.    for(j = 0; j < KICHTHUOC; j++)
  51.       if(cottrong[j] && cheoxuoitrong[i-j+SOGIA] && cheonguoctrong[i+j])
  52.       {
  53.           // Dat hoang hau vao o (i, j) tren ban co
  54.           loigiai[i] = j;
  55.           cottrong[j] = FALSE;
  56.           cheoxuoitrong[i-j+SOGIA] = FALSE;
  57.           cheonguoctrong[i+j] = FALSE;
  58.  
  59.           if(i == KICHTHUOC-1)   // Dkien dung, dat duoc con hoang hau cuoi
  60.              inloigiai(loigiai);
  61.           else                   // Buoc de qui, goi dat hoang hau i+1
  62.              hoanghau(i + 1);
  63.  
  64.           // lan nguoc
  65.           cottrong[j] = TRUE;
  66.           cheoxuoitrong[i-j+SOGIA] = TRUE;
  67.           cheonguoctrong[i+j] = TRUE;
  68.       }
  69. }
  70.  
  71. void inloigiai(int *loigiai)
  72. {
  73.    int i, j;
  74.    char c;
  75.    randomize();
  76.    textmode(C80);
  77.    textbackground(BLACK);
  78.    clrscr();
  79.    textcolor(1 + random(15));
  80.    cprintf("\n                           CHUONG TRINH 8 HOANG HAU\n   ");
  81.    cprintf("\n Loi giai %d", ++SoLoiGiai);
  82.    printf("\n\n                      0     1    2    3    4    5    6    7");
  83.    printf("\n                    ÚÄÄÄÄÂÄÄÄÄÂÄÄÄÄÂÄÄÄÄÂÄÄÄÄÂÄÄÄÄÂÄÄÄÄÂÄÄÄÄ¿");
  84.    printf("\n                   0³    ³²²²²³    ³²²²²³    ³²²²²³    ³²²²²³");
  85.    printf("\n                    ÃÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´");
  86.    printf("\n                   1³²²²²³    ³²²²²³    ³²²²²³    ³²²²²³    ³");
  87.    printf("\n                    ÃÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´");
  88.    printf("\n                   2³    ³²²²²³    ³²²²²³    ³²²²²³    ³²²²²³");
  89.    printf("\n                    ÃÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´");
  90.    printf("\n                   3³²²²²³    ³²²²²³    ³²²²²³    ³²²²²³    ³");
  91.    printf("\n                    ÃÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´");
  92.    printf("\n                   4³    ³²²²²³    ³²²²²³    ³²²²²³    ³²²²²³");
  93.    printf("\n                    ÃÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´");
  94.    printf("\n                   5³²²²²³    ³²²²²³    ³²²²²³    ³²²²²³    ³");
  95.    printf("\n                    ÃÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´");
  96.    printf("\n                   6³    ³²²²²³    ³²²²²³    ³²²²²³    ³²²²²³");
  97.    printf("\n                    ÃÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´");
  98.    printf("\n                   7³²²²²³    ³²²²²³    ³²²²²³    ³²²²²³    ³");
  99.    printf("\n                    ÀÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÙ");
  100.    for(i = 0; i < KICHTHUOC; i++)
  101.    {
  102.       gotoxy(24+5*loigiai[i], 8+2*i);
  103.       textcolor(1 + random(15));
  104.       cprintf("Q");
  105.    }
  106.    gotoxy(13, 25);
  107.    printf("Nhan phim <ESC> de thoat, nhan phim bat ky de tiep tuc ...");
  108.    c = getche();
  109.    if(c == 27)
  110.       //return;
  111.       exit(1);
  112. }
chúc vui vẻ!