Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Bài Tập C | In ra hoán vị các số từ 1 -> n. Phương pháp đệ quy quay lùi

  1. #1
    Ngày gia nhập
    04 2009
    Bài viết
    68

    Mặc định Bài Tập C | In ra hoán vị các số từ 1 -> n. Phương pháp đệ quy quay lùi

    Bài này mình sẽ liệt kê tất cả các cách sắp xếp các số từ 0 -> n vào các vị trí a[0] -> a[n-1] rồi in ra màn hình những cách thỏa mãn điều kiện. Vì còn chưa hiểu về cách khai báo nhiều biến của hàm đệ quy lên mình code sai, mong mọi người sửa lại. Mình dùng Dev C++
    C Code:
    1. #include <conio.h>
    2. #include <stdio.h>
    3.  
    4. bool ktra(int a[], int n)
    5. {
    6.      for(int i = 0; i < n; i++)
    7.            for(int j = i + 1; j < n; j++)
    8.               if(a[j] == i) return false;
    9.      return true;
    10. }
    11.  
    12. void in(int a[], int n)
    13. {
    14.      if(ktra(a, n))
    15.      {
    16.               for(int i = 0; i < n; i++)
    17.                       printf("%d ", a[i]);
    18.               printf("\n");
    19.      }
    20. }
    21.  
    22. void hoanvi(int n, int i, int a[])
    23. {
    24.      for(int j = 1; j <= n; j++)
    25.      {
    26.              a[i] = j;
    27.              if(i == n - 1) in(a, n);
    28.                   else hoanvi(n, i + 1, a[]);
    29.      }
    30.  }
    31.  
    32. int main()
    33. {
    34.     int n = 0, a[100];
    35.     printf("Nhap n:");
    36.     scanf("%d", &n);
    37.     hoanvi(n, 0, a);
    38.     getch();
    39. }
    Đã được chỉnh sửa lần cuối bởi xiu_coi : 19-04-2009 lúc 03:33 AM.

  2. #2
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Sửa lại nhiều chút, bạn xem kĩ nhé
    C Code:
    1. #include <conio.h>
    2. #include <stdio.h>
    3.  
    4. void Init(int a[], int *n)
    5. {
    6.     int i;
    7.     printf("Nhap n:");
    8.     scanf("%d", n);
    9.     for (i=1; i<=*n; i++) a[i] = 0;
    10. }
    11.  
    12. /*bool ktra(int a[], int n)   // c khong co kieu bool
    13. {
    14.      for(int i = 0; i < n; i++)
    15.            for(int j = i + 1; j < n; j++)
    16.               if(a[j] == i) return false;
    17.      return true;
    18. }*/
    19.  
    20. int Test(int a[], int n, int i)
    21. {
    22.     int j;
    23.     for (j=1; j<=n; j++)
    24.         if (a[j] == i) return 0;
    25.     return 1;
    26. }
    27.  
    28. void in(int a[], int n)
    29. {
    30.      //if(ktra(a, n))
    31.      {
    32.               for (int i=1; i<=n; i++)
    33.                       printf("%d ", a[i]);
    34.               printf("\n");
    35.      }
    36. }
    37.  
    38. void hoanvi(int n, int i, int a[])
    39. {
    40.      for(int j = 1; j <= n; j++)
    41.          if (Test(a,n,j))
    42.          {
    43.              int tmp = a[i];
    44.              a[i] = j;
    45.              if(i == n) in(a, n);
    46.                   else hoanvi(n,i+1,a);
    47.              a[i] = tmp; // quay lui
    48.          }
    49.  }
    50.  
    51. int main()
    52. {
    53.     int n = 0, a[100];
    54.     Init(a,&n);
    55.     hoanvi(n, 1, a);
    56.     getch();
    57. }

  3. #3
    Ngày gia nhập
    03 2009
    Bài viết
    45

    Đây là cách của mình, mình dùng C++ nhưng gõ theo C
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<math.h>
    4. float x[50],vt[50];int n,a[50],t;
    5. void pr(int k)
    6. {
    7. for (t=1;t<=k;t++) printf("%f ",vt[t]);
    8. printf("\n");
    9. getch();
    10. }
    11. void xet(int j,int k)
    12. {
    13. int i;
    14. for (i=1;i<=n;i++) {
    15.            if (a[i]==0) {
    16.                 vt[j]=x[i];
    17.                 a[i]=1;
    18.                 if (j<k) xet(j+1,k);else pr(k);
    19.                 a[i]=0;
    20.                 }
    21.            }
    22. }
    23. void main()
    24. {
    25. int m,i;
    26. clrscr();
    27. printf("\n So phan tu muon nhap n=");scanf("%d%*c",&n);
    28. for (i=1;i<=n;i++) a[i]=0;
    29. for (i=1;i<=n;i++) {
    30.            printf("\n x[%d]= ",i);scanf("%f%*c",&x[i]);
    31.            }
    32. printf("\n Hoan vi cua %d phan tu la:\n",n);
    33. xet(1,n);
    34. printf("\n Chinh hop chap m=");scanf("%d%*c",&m);
    35. xet(1,m);
    36. getch();
    37. }
    Đã được chỉnh sửa lần cuối bởi lethanh : 19-04-2009 lúc 03:09 PM.

  4. #4
    Ngày gia nhập
    04 2009
    Bài viết
    68

    @QuangHoang: Mình viết trên Dev C++ lên mình vẫn dùng bool đc.
    Cách giải của bạn hay hơn của mình. Mình sắp xếp hết rùi mới ktra còn bạn ktra lun. Thank nhìu. ah mà giải thích cho mình đoạn này với:
    PHP Code:
    a[i] = tmp// quay lui 

  5. #5
    Ngày gia nhập
    04 2009
    Bài viết
    68

    Hok ai giải thích hộ ah :|

Các đề tài tương tự

  1. Làm sao để lùi một ngày??
    Gửi bởi yugi331 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 05-03-2013, 08:41 PM
  2. Máy Quay HD Sony, máy quay sony Handycam, máy quay kỹ thuật số, máy quay phim mới tinh Mo
    Gửi bởi dientuthaithang trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 472
    Bài viết cuối: 03-08-2012, 05:16 PM
  3. Đồ chơi công nghệ thế kỷ 21:Bút quay,đồng hồ quay,móc quay,máy nghe lén qua sim
    Gửi bởi bigphonevn trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 06-08-2011, 10:47 PM
  4. Thiết bị thám tử: Bút quay,đồng hồ quay,móc quay,máy nghe lén qua sim
    Gửi bởi bigphonevn trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 17-07-2011, 08:23 AM
  5. Lùi lại từng hành động với Undo()?
    Gửi bởi Click8A4 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 04-05-2011, 08:46 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn