Hãy tìm cách đưa được 3 nhà sư sang bờ sông bên kia an toàn, biết rằng mỗi lần thuyền chỉ chở được hai người, và nếu số lượng quỷ mà nhiều hơn số người trên bờ sau mỗi lần chở thì tính[r]
Trang 11
BÀI TOÁN ĐƯA NGƯỜI VÀ QUỶ QUA SÔNG
Bên bờ sông có 3 nhà sư cùng với 3 con quỷ Hãy tìm cách đưa được 3 nhà sư sang bờ sông bên kia an toàn, biết rằng mỗi lần thuyền chỉ chở được hai người, và nếu số lượng quỷ mà nhiều hơn số người trên bờ sau mỗi lần chở thì tính mạng của các nhà sư sẽ bị quỷ tiêu diệt
Và điều đặc biệt là chỉ có duy nhất 1 con thuyền
Ý tưởng:
Đưa 2 quỷ qua sông, 1 con về (bên này còn 3 sư hai quỷ)
Tiếp tục đưa 2 quỷ qua sông, một con về (bên này 3 sư 1 quỷ)
Đưa 2 nhà sư qua sông, đưa một sư một quỷ về (bên này còn 2 sư hai quỷ)
Đưa hai nhà sư qua sông
Cho con quỷ ở bên kia sông về chở hai con quỷ còn lại qua
Gọi x1 là số lượng quỷ tại bờ sông 1 (0<= x1 <= 3)
Gọi y1 là số lượng người tại bờ sông 1 (0<= y1 <= 3)
Gọi x2 là số lượng quỷ tại bờ sông 2 (0<= x2 <= 3)
Gọi y2 là số lượng người tại bờ sông 2 (0<= y2 <= 3)
Gọi z là trạng thái thuyền đi (=1) hoặc thuyền về (=0)
Gọi q là số lượng quỷ xuống thuyền qua sông
Gọi n là số lượng người xuống thuyền qua sông
Điều kiện đầu của bài toán là : x1 = 3, y1=3 và x2 = 0, y2 = 0
Điều kiện kết thúc của bài toán sẽ là : x1 = 0 và y1 = 0
Bài toán được mô tả theo ba luật chính như sau:
1 (Luật 1) Nếu số quỷ nhiều hơn số người tại 1 bờ sông thì quỷ sẽ ăn thịt người
2 (Luật 2) Thuyền chỉ qua sông được khi trên thuyền có 1 hoặc 2 đối tượng để bơi thuyền
Trang 2Minh họa kết quả xử lý:
TH1: không có đối tượng bơi thuyền
TH2: số đối tượng xuống thuyền quá tải trọng
TH3: Số quỷ nhiều hơn số người tại một bờ sông
Trang 33
TH4: chuyển đúng luật và toàn bộ quỷ và người qua sông an toàn
Trang 55
Giải thuật:
Xử lý trong trường hợp nhập đúng luật (TH4), các trường hợp khác sinh viên phải cài đặt xử lý thêm
//Trạng thái ban đầu
x1 = 3;
y1 = 3;
z = 1; //z=1: thuyền đi, z=0: thuyền về
x2 = 0;
y2 = 0;
while(x1 > 0 hoặc y1 > 0){
if(z = 1){
nhập q; //Số quỷ xuống thuyền
nhập n; //Số người xuống thuyền
x1 -= q;
y1 -= n;
z = 0;
x2 += q;
y2 += n;
}else{
nhập q; //Số quỷ xuống thuyền
nhập n; //Số người xuống thuyền
x2 -= q;
y2 -= n;
z = 1;
x1 += q;
y1 += n;
} }
Cải tiến giải thuật:
1 Cải tiến 1: Viết thành hàm các lượt đi qua sông và về, hàm kiểm tra các trường hợp 1, 2,
3 và hàm xử lý tổng hợp
2 Cải tiến 2: Viết lại thành class