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

Đề tài: Code hoán vị | Tệp hoán vị

  1. #1
    Ngày gia nhập
    03 2008
    Nơi ở
    Nhà tù
    Bài viết
    37

    Red face Code hoán vị | Tệp hoán vị

    Bài toán: Tệp các hoán vị
    Với mỗi số n cho trước trong khoảng 1..9, ghi vào một tệp văn bản có tên cho trước toàn bộ các hoán vị 1..n. Hoán vị được sắp xếp tăng theo thứ tự từ điển, ví dụ 21345 < 21354

    Thuật toán bài này như sau:
    1.Hoán vị nhỏ nhất là s = 1..n
    2.Tìm điểm gãy: Tìm ngược từ s[n] trở về trước đén vị trí i đầu tiên sao cho s[i]<s[i+1] Vd:74286531
    Nếu không tìm đựoc i thì s là hoán vị lớn nhất.Nếu tìm đựoc thực hiện bứoc tiếp theo
    2.2. Tìm điểm vượt. Tìm ngược từ s[n] đến vị trí j đầu tiên sao cho s[j] > s[i] 74286531
    2.3 Đổi chỗ s[i] và s[j] VD:74386521
    2.4.Lật . Đảo trật tự của dãy s[i+1..n] ta sẽ thu đựoc hoán vị đứng sát sao hoán vị s VD: 74312568


    Còn đây là code của mình. Nhưng nó không chạy. Các bạn sửa giúp mình nhé
    C Code:
    1. #include <stdio.h>
    2. #include <string.h>
    3. void hoanvi(char so[100],int i,int b)
    4. {
    5.   char z;
    6.   z=so[i];
    7.   so[i]=so[b];
    8.   so[b]=z;
    9.  
    10. }
    11. void dao(char so[100],int k,int l)
    12. {
    13.     char z;
    14.     int i;
    15.      i=l;
    16.       while(i>k)
    17.         {
    18.          z=so[i];
    19.          so[i]=so[k];
    20.          so[k]=z;
    21.          i--;
    22.          k++;
    23.     }
    24. }
    25. int main()
    26. {
    27.     int l,i,j,b,k;
    28.     char so[100];
    29.     printf("Nhap so:");
    30.     gets(so);
    31.     l=strlen(so);
    32.      for(i=l;i>=0;i--)
    33.       {
    34.       if (so[i]>so[i-1])
    35.             {
    36.         b=i-1;
    37.          for(i=l;i>b;i--)
    38.                    {
    39.                if(so[i]>so[b])
    40.             {
    41.                             k=i;
    42.                 hoanvi(so,i,b);
    43.                 dao(so,k,l);
    44.                 printf("%s",so);
    45.             }
    46.            }
    47.  
    48.         }
    49.       }
    50.  
    51. }
    Đã được chỉnh sửa lần cuối bởi kegiaumat055 : 27-03-2009 lúc 06:51 PM.

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

    Nên sử dụng thuật toán sinh kế tiếp để liệt kê hoán vị, như vậy thì các dãy in ra sẽ theo thứ tự sắp xếp luôn. Bạn tham khảo thuật toán nhé.

    C++ Code:
    1. /* Phuong phan sinh:
    2.  *      Liet ke hoan vi day so n phan tu
    3.  * TQH 20081107
    4.  */
    5. #include <iostream>
    6. using namespace std;
    7.  
    8. void Swap(int *a, int i, int j)         //Hoan vi 2 phan tu o 2 vi tri
    9. {
    10.     int temp=a[i];
    11.     a[i]=a[j];
    12.     a[j]=temp;
    13. }
    14.  
    15. void SortBubble(int *a, int n, int k)   //Sap xep lai doan cuoi mang cho giam dan
    16. {
    17.     for (int i=k; i<n-1; i++)
    18.         for (int j=k; j< n-j+k; j++)
    19.             if (a[j] > a[j+1]) Swap(a,j,j+1);
    20. }
    21.  
    22. void ListSwap(int *a, int n)            //Ham liet ke chinh
    23. {
    24.     cout << "Enter number n = ";cin >> n;
    25.     a=new int [n];
    26.         if (a==NULL) return;
    27.  
    28.     for (int i=0; i<n; i++) a[i]=i+1;              //Khoi tao
    29.     for (int i=0; i<n; i++) cout << a[i] <<" ";    //Gia tri dau
    30.     cout << endl;
    31.  
    32.     while (1)
    33.     {
    34.         int i=n-1;
    35.         while (i>=0 && a[i]<a[i-1]) i--;
    36.         if (i<0) return;
    37.         int min;
    38.         for (int j=n-1; j>=i; j--)
    39.             if (a[j] > a[i-1]) {min=j;j=i;}
    40.         Swap(a,i-1,min);
    41.         SortBubble(a,n,i);
    42.         for (int j=0; j<n; j++) cout << a[j] <<" ";
    43.         cout << endl;
    44.     }
    45.     delete[]a;
    46. }
    47.  
    48. int main()
    49. {
    50.     int *a,n;
    51.     ListSwap(a,n);
    52. }

  3. #3
    Ngày gia nhập
    03 2008
    Nơi ở
    Nhà tù
    Bài viết
    37

    Mình muốn sửa bài của mình !

  4. #4
    Ngày gia nhập
    03 2008
    Nơi ở
    Nhà tù
    Bài viết
    37

    Mình sửa code rồi. Nó chạy được nhưng cho kết quả sai
    Đã được chỉnh sửa lần cuối bởi kegiaumat055 : 27-03-2009 lúc 06:52 PM.

  5. #5
    Ngày gia nhập
    03 2008
    Nơi ở
    Nhà tù
    Bài viết
    37

    Sao không ai giúp mình vậy

  6. #6
    Ngày gia nhập
    03 2009
    Nơi ở
    Hà Nội
    Bài viết
    74

    Mặc định Code hoán vị | Tệp hoán vị

    Thuật toán của bạn có vấn đề :
    2.Tìm điểm gãy: Tìm ngược từ s[n] trở về trước đén vị trí i đầu tiên sao cho s[i]<s[i+1] Vd:74286531
    Nếu không tìm đựoc i thì s là hoán vị lớn nhất.Nếu tìm đựoc thực hiện bứoc tiếp theo
    2.2. Tìm điểm vượt. Tìm ngược từ s[n] đến vị trí j đầu tiên sao cho s[j] > s[i] 74286531
    như 2 số sau là liên tiếp: 24351
    24513
    mà nó đổ tận 3 vị trí --> thuật toán của bạn sai.bài này có thể dùng đệ quy:
    tham khảo code của mình:
    Code:
    #include <stdio.h>
    FILE *f;
    int n=5,tg;
    int sl[9]={1,1,1,1,1,1,1,1,1};
    void get(int x);
    int main(){
    
    
        f=fopen("hoanvi.txt","w+");
        get(1);
        fclose(f);
    }
    void get(int x){
        int i;
        if (x>n) fprintf(f,"%d\n",tg);
        else{
            for(i=0;i<n;i++) if(sl[i]==1){
                sl[i]=0;
                tg=tg*10+i+1;
                get(x+1);
                tg=(tg-i-1)/10;
                sl[i]=1;
            }
        }
    }

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

  1. Tại sao lại bỏ Store Proceduce nếu code theo hướng Code First trong MVC3
    Gửi bởi rogerminh2401 trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 5
    Bài viết cuối: 02-11-2012, 08:22 PM
  2. Trả lời: 5
    Bài viết cuối: 27-04-2012, 07:51 PM
  3. compiler Warning: Unreachable code và chạy sai trong khi code đúng. Vì sao?
    Gửi bởi lovemoney trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 19
    Bài viết cuối: 19-01-2012, 10:02 PM
  4. Bài tập C++ Nhập code và name sv vào in ra thì name in đúng nhưng code thì in ra cả 2 code lẫn name
    Gửi bởi spacy0212 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 27-09-2011, 08:47 AM
  5. Code quản lý sinh viên bằng danh sách lối vòng. Giúp mình thay đổi code kế thừa?
    Gửi bởi caocanha trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 6
    Bài viết cuối: 04-05-2009, 03:39 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