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

Đề tài: Bài toán Đong nước môn Trí Tuệ Nhân Tạo

  1. #1
    Ngày gia nhập
    10 2008
    Nơi ở
    Hà Nội
    Bài viết
    49

    Thumbs down Bài toán Đong nước môn Trí Tuệ Nhân Tạo

    Chắc nhiều bạn đã học qua hoặc đang học môn Trí Tuệ Nhân Tạo. Một bài toán điển hình của môn này là bài toán "Đong nước".

    Cho hai bình rỗng X và Y, đổ qua đổ lại làm sao cho đong đc Z lít nước. VD như cho VX = 5 và VY = 7 và z = 4.

    Ý tưởng:
    Múc đầy bình 7
    Trút hết qua bình 5 cho đến khi 5 đầy.
    Đổ hết nước trong bình 5
    Đổ hết nước còn lại từ bình 7 sang bình 5
    Múc đầy bình 7
    Trút hết qua bình 5 cho đến khi bình 5 đầy.
    Phần còn lại chính là số nước cần đong.

    Gọi lượng nước chứa trong bình X là x (0<=x<=VX)
    Gọi lượng nước chứa trong bình Y là y (0<=y<=VY)
    Điều kiện đầu của bài toán là : x = 0 và y=0
    Điều kiện kết thúc của bài toán sẽ là : x = z hoặc y = z

    Bài toán đc giả dựa theo ba luật chính như sau:
    (L1) Nếu bình X đầy thì đổ hết nước trong bình X đi.
    (L2) Nếu bình Y rỗng thì đổ đầy nước vào bình Y.
    (L3) Nếu bình X không đầy và bình Y không rỗng thì hãy trút nước t? bình Y sang bình X (cho đến khi bình X đầy hoặc bình Y hết nước).
    Bài toán cần có điều kiện số nước cần đong là một bội số của ước số chung lớn nhất của thể tích hai bình.
    z = n x USCLN(VX, VY) (với n nguyên dương)

    Áp dụng với bài toán VD trên sẽ cho in ra:
    Vx = 3, Vy = 4 và z = 2
    Ban đầu : x = 0, y = 0
    Luật (L2) -> x = 0, y = 4
    Luật (L3) -> x = 3, y = 1
    Luật (L1) -> x = 0, y = 1
    Luật (L3) -> x = 1, y = 0
    Luật (L2) -> x = 1, y = 4
    Luật (L3) -> x = 3, y = 2

    Ý tưởng là như vậy

    Bài giải có thể viết bằng nhiều loại ngôn ngữ khác nhau mà vẫn rất ngắn gọn mà hay.
    Lập trình trên C hay Pascal mình tàm tạm, mình đã làm bằng C++ nhưng còn lỗi lung tung, chạy không như mình mong muốn.

    Bạn nào rành C++ hướng dẫn mình chút ít EXP để giải bài này bằng C++ nhé.
    Mình đã học qua C++ nhưng lâu quá rồi ko dùng, ko chắc nhớ đc bao nhiêu nữa.
    Mình muốn làm lại bài này bằng nhiều loại ngôn ngôn ngữ, tích lũy thêm kiến thức.
    Tiện thể mình mong bạn nào rành về VB chỉ giáo mình luôn nhé. Mình thích làm bằng VB lắm, nhưng chẳng còn nhớ bao nhiêu nữa.
    Mong các bạn giúp đỡ.

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - Cậu post cái bài lỗi của cậu lên xem ! Suy nghĩ cả bài thì tui không có thời gian, cậu cứ đưa giải thuật mà cậu nghĩ rùi tui viết bằng C++ cho cậu !
    Mình muốn làm lại bài này bằng nhiều loại ngôn ngôn ngữ, tích lũy thêm kiến thức.
    Cậu học chắc 1 ngôn ngữ = cậu học 10 ngôn ngữ mà chỉ ở mức độ biết ! Chỉ tốn thời gian học syntax chứ chả được gì, cậu học lập trình chứ không học ngôn ngữ !

  3. #3
    Ngày gia nhập
    10 2008
    Nơi ở
    Hà Nội
    Bài viết
    49

    Cảm ơn góp ý của bạn, căn bản cái gì mình cũng muốn biết, mà biết nhiều nhưng chẳng giỏi đc về một cái nhất định nào, khổ thế đấy.
    Mình sẽ xem xét lại. Thank bạn!
    Mình gõ code lên đây, bạn xem sai sót loằng ngoằng ở chỗ nào bạn sửa dùm mình nha, mình còn gà code lung tung bạn có cáu cũng đừng "tạt tai" mình nha, hj hj!

    C++ Code:
    1. #include"iostream.h"
    2. #include"conio.h"
    3. #include"math.h"
    4. #include"stdio.h"
    5. int Vx,Vy,x,y,z,min,max,us;
    6. void nhap()
    7.      {
    8.         \* nhập vào thể tích 2 bình Vx,Vy *\
    9.         do
    10.             {
    11.                cout<<"nhập vào thể tích bình x:";
    12.                cin>>Vx;
    13.                cout<<" nhập vao thể tích bình y:";
    14.                cin>>Vy;
    15.            } while ((Vx<0)||(Vy<0));
    16.             \* Theo điều kiện bài toán thì số lít nước cần đong phải là bội số của ước số chung lớn nhất của Vx và Vy. Tìm ước số chung lớn nhất của 2 bình x và y*\
    17.             min=Vx
    18.             if(Vx>Vy) min =Vy;
    19.             for(i=min;i<0;i--)
    20.                  {
    21.                    if(Vx % i ==0)||(Vy % i==0))
    22.                     {
    23.                      cout<<" in ra danh sách các ước số của bình x,y:";
    24.                      cout<< i ;
    25.                      }
    26.                 }
    27.     \* còn lấy ước số chung lớn nhất thì em thủ thế này nhưng không dc *\
    28.  
    29.           usln=1; \* ước số lớn nhất gán bằng 1 *\
    30.           for( i=0;i<vx;i++)
    31.              {
    32.               if (usln < i) i=usln;
    33.                cout<<"ước số lơn nhất là :"<<usln;      
    34.               }
    35.         \*nhập vào thể tích nước cần đong(z), với điều kiện z phải là bội số chung của ước số chung lớn nhất của thể tích 2 bình vừa nhập vào *\
    36.             Do    
    37.               {
    38.                  cout<<"nhập vào lượng nước cần đong z :";
    39.                  cin>> z;          
    40.                } while(z % usln != 0);
    41.      }
    42.  void dong_nuoc()
    43.         {
    44.           x=0;y=0;
    45.           while((x!=z) ||(y!=z))        
    46.              {
    47.                if(x=Vx) x=o;
    48.                cout<<" in giá trị của x :"<< x<<" giá trị của y:"<<y;
    49.                if(y=0) y=Vy;
    50.                 cout <<" in giá trị của x :"<< x<<" giá trị của y:"<<y;
    51.                if(y>0)
    52.                     {
    53.                      min = Vx-x;
    54.                      if((Vx-x)>y) min =y;
    55.                      x=x+min;
    56.                      y=y-min
    57.                      }
    58.                cout<<" in giá trị của x :"<< x<<" giá trị của y:"<<y;
    59.                }
    60.          }
    61.  
    62. void main()
    63.  {
    64.          clrscr();
    65.          nhap();
    66.          dong_nuoc();
    67.          getch();
    68. }


    Đây là phần code mình viết nhưng chua chạy mong bạn sửa dùm mình nha, chỉ luôn cho mình viết sai ở đâu, share cho mình it EXP nha.
    Nhanh chút bạn nha, mình nóng ruột lắm hj hj!
    Thank bạn nhiều lắm!
    Ôi lằng nhằng quá, cứ linh tinh thế nào ý, rối bù hết cả lên rồi, loạn rồi.
    Bạn ơi mình mới nghĩ ra là:
    Khi nhập vào Vx và Vy thỏa mãn điều kiện >0, khi nhập vào số nước cần đong z thì chạy luôn một hàm kiểm tra xem z có phải bội số của uscln của cả Vx và Vy ko?
    Nếu ko thì dừng luôn và thông báo bài toán ko có lời giải.
    Nếu có mới tiếp tục chạy hàm đong_nước.
    Nói về hàm thì mình thuộc loại gà chưa ra khỏi trứng.
    Bạn sửa luôn bài mình theo ý tưởng trên đc ko?
    Bạn xem phương án nào hay chỉ giúp mình luôn nhé.
    Thank bạn nhiều!

    Đọc mấy bài giải thuật toán của rr trên 4r hồi tết mà nể quá, mặc dù đọc chẳng hiểu ji.
    Trước rr học ở đâu vậy? Đỉnh wa.
    Em tập tành bước vào lập trình, sẽ cố gắng, mong bác "gõ đầu" em nhiều nhiều nhé.
    Thank!

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - Tui tự học là chính, hiện tại trên trường tui chỉ mới lấy lớp OOP with C++ thôi. Với lại ở đây thầy cô chẳng giúp nhiều cho cậu, cái chính vẫn là cậu thôi.
    - Bây giờ tui đang trong lớp nên không giúp cậu nhiều được, tranh thủ break time nên vào search web tí thôi.
    - Nhìn cách cậu code tui nghĩ cậu dùng VC++ 6.0 hoặc TC++, và nếu cậu thực sự muốn học C++ thì tui đề nghị cậu không xài 2 thằng này. Lý do thì đơn giản thôi, tui không thích đọc và viết code non-standard.
    - Download Code::Block IDE, hoặc DevCpp IDE, hoặc Microsoft Visual C++ 2008 Express Edition hoặc KDevelop IDE. Một trong 4 thằng này đều ok. Cậu down về và install đi rùi tính tiếp nhé ! Good luck

  5. #5
    Ngày gia nhập
    10 2008
    Nơi ở
    Hà Nội
    Bài viết
    49

    Ý! Uhm mình sẽ tiếp thu ý kiến của bạn. Có nhiều cái mình chưa biết, mình sẽ học hỏi sau.
    Bạn xem bài tập cho mình luôn với, mình nóng ruột quá.
    Bạn sửa luôn dùm mình với nha.
    Chừng nào còn chưa có đc lời giải thỏa đáng cho bài toán này mình còn khó chịu wa, bạn giúp mình với nha.
    Đang măm măm trưa nè, nuốt hổng trôi.
    Thank muck!

    Tiger ngồi há hốc mồm, nước dãi chảy ròng ròng, lim dim con mắt, ngóng dài cổ... chờ rox_rock help. :(

    Mình viết lại thế này, máy lỗi ko chạy thử đc, các bạn kiểm tra dùm mình nhé.
    Coi có ji ko ổn cho mình chút ý kiến.
    Thank all!

    C++ Code:
    1. #include ”iostream.h”
    2. #include “stdio.h”
    3. #include “conio.h”
    4. #include “math.h”
    5. Int Vx,Vy,x,y,z,USCLN,a,b,k;
    6. Void Nhap()
    7. {
    8. Do{
    9. Cout<<”\n Nhap vao the tich binh 1 Vx:;
    10. Cin>>Vx;
    11. Cout<< “\n Nhap vao the tich binh 2 Vy:;
    12. Cin>>Vy;
    13. } While((Vx<0) &&(Vy<0));
    14. a=Vx; b=Vy;
    15. While((a!= 0)&&(b != 0))
    16. {
    17. If(a>=b)
    18. a - = b;
    19. Else
    20. b - = a;
    21. }
    22. If(a = = 0)
    23. USCLN = b
    24. Else
    25. USCLN = a;
    26. \* Bài toán chỉ có được lời giải khi số lít nước cần đong là bội số của ước số chung lớn nhất của thể tích hai bình: z=n*USCLN(Vx,Vy) (Với n là số nguyên dương) *\
    27. Do{
    28. Cout<< “\n Nhap vao z lit nuoc can dong:;
    29. Cin>> z;
    30. } While ((z % USCLN) != 0);
    31. }
    32. Void Dong_nuoc()
    33. {
    34. x=0; y=0;
    35. While((x != z)&&(y != z))
    36. }
    37. If(x = = Vx)
    38. {
    39. x = 0;
    40. Cout<< “ \nL1:<<“x:<<x<<“          ”<<“y:<<y;
    41. }
    42. If (y = = 0)
    43. {
    44. y = Vy;
    45. Cout<< “\nL2:<<“x:<<x<<“          ”<<“y:<<y;
    46. }
    47. If (y > 0)
    48. {
    49. {
    50. If ((Vx - x)<y)
    51. k = (Vx - x);
    52. Else
    53. k = y;
    54. }
    55. x = x + k;
    56. y = y – k;
    57. Cout<< “\nL3:<<“x :<<x<<“          ”<<“y:<<y;
    58. }
    59. }
    60. }
    61. Void main()
    62. {
    63. Clrscr();
    64. Nhap();
    65. Dong_nuoc();
    66. Getch();
    67. }
    Đã được chỉnh sửa lần cuối bởi Xcross87 : 17-10-2008 lúc 06:36 AM.

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Bài toán Đong nước môn Trí Tuệ Nhân Tạo

    - Tui thành thật sorry cậu nhưng quả thật quên mất thread này.
    - Nhưng cậu chưa biết hoàn cảnh tui ra sao mà cậu đã chửi tui là quá đáng !!!
    - Cậu thấy 2 ngay qua tui toàn online từ 10h30-11h tối bên này, tui đi làm về thì chỉ lên coi được 1 tí, nếu bài nào ngắn đơn giản thì tui giúp chứ còn bài làm thực sự thì làm sao tui đọc cho nổi, tui làm từ 9h sáng đến 10h30 tối lận cậu à ! Cậu phải thông cảm cho tui chứ !
    - Tui hứa với cậu tui giúp thì tui nhất định sẽ giúp, do tui chưa sắp xếp thời gian được thôi. Chứ tui có phải làm kiêu làm dáng với cậu thì tui được gì ?
    - Thôi thì dù gì lỗi cũng của tui, do tui quên để ý.
    - Còn đây là bài giải tui dựa theo giải thuật cậu mà làm :
    C++ Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. void nhapTheTichXYVaLuongNuoc( int& Vx, int& Vy, int& luong_nuoc )
    6. {
    7.     do {
    8.         cout << "Nhap the tich ( Vx, Vy ) dieu kien : vX < Vy and vX, Vy > 0 :\n";
    9.         cin >> Vx >> Vy;
    10.     }
    11.     while( ( Vx < 0 ) || ( Vy < 0 ) || Vx >= Vy );
    12.  
    13.     cout << "Nhap luong nuoc can dong : ";
    14.     cin >> luong_nuoc;
    15. }
    16.  
    17. bool tonTaiLoiGiai( int ucln_cua_VxVy, int luong_nuoc_can_dong )
    18. {
    19.     if( ( luong_nuoc_can_dong % ucln_cua_VxVy ) == 0 )
    20.     {
    21.         return true;
    22.     }
    23.     return false;
    24. }
    25.  
    26. int uocChungLonNhat( int x, int y )
    27. {
    28.     if( y == 0 )
    29.         return x;
    30.     else
    31.         return uocChungLonNhat( y, x % y );
    32. }
    33.  
    34. void inLuongNcTrongThung( int Vx, int Vy )
    35. {
    36.     cout << "\n + Binh X hien tai chua : " << Vx;
    37.     cout << "\n + Binh Y hien tai chua : " << Vy;
    38.     cout << "\n";
    39. }
    40.  
    41. int thucHienDongNuoc( int Vx, int Vy, int luong_nuoc_can_dong )
    42. {
    43.     int binh_x = 0;
    44.     int binh_y = 0;
    45.     int buoc   = 1;
    46.  
    47.     do {
    48.         if( binh_x == Vx )
    49.         {
    50.             cout << "\n -> Buoc thu " << buoc << "\n";
    51.             cout << "( L1 ) : Neu binh X day, thi do het nc binh X di ";
    52.             binh_x = 0;
    53.             buoc++;
    54.             inLuongNcTrongThung( binh_x, binh_y );
    55.         }
    56.         else if( binh_y == 0 )
    57.         {
    58.             cout << "\n -> Buoc thu " << buoc << "\n";
    59.             cout << "( L2 ) : Neu binh Y rong thi do day nc vao binh Y ";
    60.             binh_y = Vy;
    61.             buoc++;
    62.             inLuongNcTrongThung( binh_x, binh_y );
    63.         }
    64.         else if( binh_x != Vx && binh_y != 0 )
    65.         {
    66.             cout << "( L3 ) Neu binh X khong day va binh Y khong rong thi trut nc \n"
    67.                  << "tu binh Y sang binh X cho den khi binh X day hoac binh Y het nuoc";
    68.             while( binh_x < Vx && binh_y != 0 )
    69.             {
    70.                 cout << "\n -> Buoc thu " << buoc << "\n";
    71.                 buoc++;
    72.                 if( binh_y >= Vx )
    73.                 {
    74.                     int tam = binh_x;
    75.                     binh_x  = Vx;
    76.                     binh_y -= Vx - tam;;
    77.                 }
    78.                 else // else if( binh_y < Vx )
    79.                 {
    80.                     binh_x += binh_y;
    81.                     binh_y  = 0;
    82.                 }
    83.                 inLuongNcTrongThung( binh_x, binh_y );
    84.             }
    85.             cin.get();
    86.         }
    87.     }
    88.     while( binh_x != luong_nuoc_can_dong && binh_y != luong_nuoc_can_dong );
    89.  
    90.     if( binh_x == luong_nuoc_can_dong )
    91.         return Vx;
    92.     else
    93.         return Vy;
    94. }
    95.  
    96. int main()
    97. {
    98.     int the_tich_binh_x;
    99.     int the_tich_binh_y;
    100.     int luong_nuoc;
    101.  
    102.     nhapTheTichXYVaLuongNuoc( the_tich_binh_x, the_tich_binh_y, luong_nuoc );
    103.  
    104.     int ucln_cuaXY = uocChungLonNhat( the_tich_binh_x, the_tich_binh_y );
    105.  
    106.     cout << "ucln_cuaXy = " << ucln_cuaXY << "\n";
    107.  
    108.     if( tonTaiLoiGiai( ucln_cuaXY,luong_nuoc ) == true )
    109.     {
    110.         int thung_chua_luong_nuoc = thucHienDongNuoc( the_tich_binh_x, the_tich_binh_y, luong_nuoc );
    111.         cout << "\n Thung chua luong nuoc can dong la thung co the tich = "
    112.              << thung_chua_luong_nuoc << "\n";
    113.     }
    114.     else
    115.     {
    116.         cout << "\n Khong ton tai loi giai. Chuong trinh ket thuc \n";
    117.     }
    118.  
    119.     return 0;
    120. }
    - Code cậu viết còn yếu quá, bỏ dùng biến cục bộ đi, code cậu cũng chẳng phải standard C++. Tập viết theo standard để code portable !

  7. #7
    Ngày gia nhập
    10 2008
    Nơi ở
    Hà Nội
    Bài viết
    49

    Uhmm! code hay vậy ta.
    Thành thật sorry cậu! Mình sai rồi.

  8. #8
    Ngày gia nhập
    01 2012
    Nơi ở
    localhost
    Bài viết
    140

    Cái này mình dựa sát vào ý tưởng giải thuật đầu đề nè:
    C++ Code:
    1. #include <iostream>
    2. #include <conio.h>
    3. using namespace std;
    4.  
    5. int ucln(int, int);
    6.  
    7. int x, y;
    8. int vx, vy;
    9. int z;
    10.  
    11. int luat1();
    12. int luat2();
    13. int luat3();
    14.  
    15. int main()
    16. {
    17.     cout << "Bai Toan Dong Nuoc" << endl;
    18.     cout << "Nhap dung tich binh X: ";
    19.     cin >> vx;
    20.     cout << "Nhap dung tich binh Y: ";
    21.     cin >> vy;
    22.     cout << "Nhap dung tich can dong: z = ";
    23.     cin >> z;
    24.  
    25.     if (z % ucln(vx, vy) != 0)
    26.     {
    27.         cout << "Khong the dong duoc theo yeu cau!" << endl;
    28.     }
    29.     else
    30.     {
    31.         x = 0;
    32.         y = 0;
    33.         while (x != z && y != z)
    34.         {
    35.             luat1();
    36.             luat2();
    37.             luat3();
    38.         }
    39.     }
    40.     getch();
    41.     return 0;
    42. }
    43.  
    44. int ucln(int a, int b)
    45. {
    46.     if (a <= 0 || b <= 0)
    47.         return 1;
    48.     while (a % b != 0 && b % a != 0)
    49.     {
    50.         if (a > b)
    51.             a = a % b;
    52.         else
    53.             b = b % a;
    54.     }
    55.     return a > b ? b : a;
    56. }
    57. int luat1()
    58. {
    59.     if (x == vx)
    60.     {
    61.         x = 0;
    62.         cout << "Luat L1 -> x = " << x << ", y = " << y << endl;
    63.         return 1;
    64.     }
    65.     return 0;
    66. }
    67. int luat2()
    68. {
    69.     if (y == 0)
    70.     {
    71.         y = vy;
    72.         cout << "Luat L2 -> x = " << x << ", y = " << y << endl;
    73.         return 1;
    74.     }
    75.     return 0;
    76. }
    77. int luat3()
    78. {
    79.     if (x < vx && y > 0)
    80.     {
    81.         if (y > vx - x)
    82.         {
    83.             y -= vx - x;
    84.             x = vx;
    85.         }
    86.         else
    87.         {
    88.             x += y;
    89.             y = 0;
    90.         }
    91.         cout << "Luat L3 -> x = " << x << ", y = " << y << endl;
    92.         return 1;
    93.     }
    94.     return 0;
    95. }
    Rẹt rẹt..

  9. #9
    Ngày gia nhập
    12 2009
    Nơi ở
    The country of happiness
    Bài viết
    182

    giải thuật hay phết.
    code :

    C++ Code:
    1. int vx, vy, z, x, y;
    2. int nstep ;
    3. queue<int> trace;
    4.  
    5. void read() {
    6.     cin >> vx >> vy >> z;
    7. }
    8. void solve() {
    9.     if(z % gcd(vx,vy) != 0){
    10.         cout << "-1";
    11.         return;
    12.     }
    13.     while(true){
    14.         if(x < vx && y > 0 ){
    15.             if(y > vx-x){
    16.                 y -= (vx-x);
    17.                 x = vx;
    18.             }
    19.             else {
    20.                 x += y;
    21.                 y = 0;
    22.             }
    23.         }
    24.         else {
    25.             if(x == vx) x = 0;
    26.             if(y == 0) y = vy;
    27.         }
    28.         nstep++;
    29.         trace.push(x); trace.push(y);
    30.         if(x == z || y == z){
    31.             cout << nstep << endl;
    32.             while(!trace.empty()){
    33.                 cout << trace.front() ; trace.pop();
    34.                 cout << " " << trace.front(); trace.pop();
    35.                 cout << endl;
    36.             }
    37.             return;
    38.         }
    39.     }
    40. }

    input :
    Code:
    3 4 2
    output :
    Code:
    6
    0 4
    3 1
    0 1
    1 0
    1 4
    3 2
    Trích dẫn Nguyên bản được gửi bởi Wazi Armstrong Xem bài viết
    Ôi skill của mình đã đạt đến hàng tuyệt đỉnh
    Không chỉ ăn, tắm, đi lại có thể code
    Mà giờ đã mình có thể code cả khi ngủ. Code tạm vào buffer của não, lúc nào dậy chỉ việc viết ra một cách trôi chảy không lưỡng lự.
    PS: Nếu ngủ dài rảnh rảnh có thể debug luôn, dậy chỉ việc build ?
    Trích dẫn Nguyên bản được gửi bởi vietanh8286 Xem bài viết
    Lập trình viên giỏi là lập trình viên có vợ

  10. #10
    Ngày gia nhập
    10 2010
    Bài viết
    1

    Có bác nào có code bài toán đong nước này bằng ngôn ngữ prolog không ? Cho mình xin với

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