Trường Đại học Công Nghệ Thông Tin
Đại học Quốc gia Hồ Chí Minh
------------------
Bộ môn:
Phương pháp luận sáng tạo khoa học
Bài luận :
Trình bày về nội dung vận dụng những kiến
thức về phương pháp luận, sáng tạo để giải
quyết một vấn đề nào đó trong tin học.
GVHD: GS.TSKH Hoàng Văn Kiếm Sinh viên: Nghiêm Xuân Hiệp
MSSV: 06520155
Khoa: MMT&TT 01
Binh
sĩ
2
I. Bài toán :
Trong bài toán Josephus, một nhóm binh sĩ bị kẻ thù bao vây và một
binh sĩ được chọn để đi cầu cứu. Việc chọn thực hiện theo cách sau: Một số
nguyên n và một binh sĩ được chọn một cách ngẫu nhiên. Các binh sĩ được
sắp xếp theo vòng tròn, và họ đếm bắt đầu từ binh sĩ được chọn ngẫu nhiên.
Khi đạt đến n, binh sĩ tương ứng được lấy ra khỏi vòng và việc đếm lại bắt
đầu từ binh sĩ tiếp theo. Quá trình này cứ tiếp tục cho đến khi chỉ còn lại một
binh sĩ. Đó là người sẽ được chọn để đi cầu cứu. Viết thuật toán cài đặt cách
chọn và tìm ra binh sĩ sẽ được chọn.
Binh
sĩ
2
II. Giải quyết bài toán:
1. Phân tích bài toán:
Các binh sĩ được sắp xếp đứng thành vòng tròn và có thứ tự lần lượt từ
1 đến m (với m là số binh sĩ).
: Binh sĩ thứ n bị loại ra.
Binh
sĩ
3
Binh
sĩ
2
Binh
sĩ
6
Binh
sĩ
5
Binh
sĩ
4
Binh
sĩ
1
Binh
sĩ
7
Binh
sĩ
m
Binh
sĩ
…..
Binh sĩ
3
Binh sĩ
2
Binh sĩ
6
Binh
sĩ
2
Binh
sĩ
5
Binh
sĩ
4
Binh
sĩ
1
Binh
sĩ
7
Binh
sĩ
m
Binh
sĩ
…..
Chọn n = 3
Binh sĩ thứ 2 được
chọn ngẫu nhiên
Binh sĩ thứ 4 sẽ bị loại
sau khi đếm đến n.
Binh sĩ thứ 7 sẽ bị loại
sau khi đếm đến n.
Chọn n là một số ngẫu nhiên và chọn một binh sĩ ngẫu nhiên
(n nguyên dương)
- Chọn n là một số ngẫu nhiên và chọn một binh sĩ ngẫu nhiên
(n nguyên dương).
- Đếm lần lượt từ vị trí binh sĩ ngẫu nhiên đầu tiên được chọn cho đến
vị trí của binh sĩ thứ n thì loại binh sĩ đó ra, và tiếp tục đếm từ binh sĩ kế tiếp
cho đến vị trí thứ n tiếp theo.....
- Khi đó binh sĩ nào là người cuối cùng còn lại sẽ là người được chọn
để đi cầu cứu.
2. Giải quyết vấn đề - bài toán trong tin học:
Đối với bài toán này, điều ta quan tâm là số lượng các binh sĩ, số thứ
tự các binh sĩ, số thứ tự của binh sĩ đầu tiên được chọn, một số n nguyên
dương ngẫu nhiên với điều kiện n phải nhỏ hơn hoặc bằng số lượng các binh
sĩ, và cuối cùng là tìm ra phần tử (binh sĩ) cuối cùng.
Dùng phương pháp trực tiếp cùng với các nguyên lý, nguyên tắc để giải
quyết bài toán trên.
- Đặc điểm của cách giải quyết này là đều xác định trực tiếp được
lời giải qua một thủ tục tính toán (công thức, hệ thức, định luật,…)
hoặc qua các bước căn bản để có được lời giải. Đối với phương
pháp này, việc giải quyết bài toán trên máy tính chỉ là thao tác lập
trình hay là sự chuyển đổi lời giải từ ngôn ngữ bên ngoài sang các
ngôn ngữ được sử dụng trong máy tính.
- Với bài toán này, ta sẽ dùng ngôn ngữ lập trình thông dụng là C để
giải quyết bài toán trên máy tính.
Để thực hiện tốt phương pháp trực tiếp, chúng ta áp dụng các nguyên lý sau:
a) Nguyên lý 1:
Chuyển đổi dữ liệu bài toán thành dữ liệu của chương trình, có
nghĩa là “Dữ liệu của bài toán sẽ được biểu diễn lại dưới dạng các
biến của chương trình thông qua các quy tắc xác định của ngôn ngữ
lập trình”.
• Gọi số lượng các binh sĩ là : m.
• Số thứ tự (vị trí) của các binh sĩ : sẽ được biểu diễn dưới dạng 1
danh sách ta sẽ phân tích ở dưới. Trong đó mỗi binh sĩ là 1 phần
tử element_type và số thứ tự này sẽ đại diện cho mỗi
element_type đó.
• Số thứ tự của binh sĩ được chọn ngẫu nhiên đầu tiên : k.
• Một số đếm n ngẫu nhiên : n.
• Phần tử cuối cùng được chọn trong danh sách chính là binh sĩ
được chọn : element.
• m, k, n, element_type, element đều là các số nguyên dương.
b) Nguyên lý 2:
Chuyển đổi quá trình tính toán của bài toán thành các cấu trúc của
chương trình, có nghĩa là “Mọi quá trình tính toán đều có thể mô tả và
thực hiện dựa trên ba cấu trúc cơ bản: Cấu trúc tuần tự, cấu trúc rẽ
nhánh và cấu trúc lặp”.
- Ở đây ta sẽ sử dụng cấu trúc tuần tự: để biểu diễn các phần tử
(binh sĩ) ta dùng một list (danh sách) dạng : node.
- Trong node ta quan tâm đến phần tử đầu tiên và phần tử cuối cùng:
first và last.
Cấu trúc node
first
(element_type)
next
(element_type)
last
(element_type)
........ ........