Báo cáo đồ án cấu trúc dữ liệu và thuật toán. Đề tài Gelfand’s play

25 3.4K 11
Báo cáo đồ án cấu trúc dữ liệu và thuật toán. Đề tài Gelfand’s play

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Báo cáo đồ án cấu trúc dữ liệu và thuật toán. Đề tài Gelfand’s play. Bàn cờ kích thước n x n đặt chéo. Một con tốt nằm ở đỉnh dưới. Hai người lần lượt đẩy con tốt đi một nước. Không được đi lùi lại. Người đầu tiên đặt được con tốt sang đầu ngược lại là người thắng cuộc. Tìm thuật toán tối ưu cho người đi nứơc đầu tiên.

Đồ án Cấu trúc dữ liệu Thuật toán Nhóm 11 Lớp 10T1 Trang 1 / 25 ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN Tel. (84-511) 736 949, Fax. (84-511) 842 771 Website: itf.ud.edu.vn, E-mail: cntt@edu.ud.vn ---*--- BÁO CÁO ĐỒ ÁN CẤU TRÚC DỮ LIỆU THUẬT TOÁN GVHD : LÊ QUÝ LỘC NHÓM : 10NH11 LỚP : 10T1 SVTH : TRẦN QUỐC HOÀN NGUYỄN TÀI ĐỨC LÀNH NGUYỄN THÀNH NHẬT Đà Nẵng, tháng 1 năm 2013 Đồ án Cấu trúc dữ liệu Thuật toán Nhóm 11 Lớp 10T1 Trang 2 / 25 MỤC LỤC LỜI MỞ ĐẦU . 3 ĐỀ BÀI: 4 PHÂN TÍCH THIẾT KẾ THUẬT TOÁN 5 I. Phân tích bài toán .5 II. Thuật toán .5 III. Nhận xét 9 IV. Thiết kế chương trình 9 V. Các hàm sử dụng trong chương trình 10 VI. Chương trình đầy đủ 11 VII. Hình ảnh chạy chương trình .19 Đồ án Cấu trúc dữ liệu Thuật toán Nhóm 11 Lớp 10T1 Trang 3 / 25 LỜI MỞ ĐẦU Cấu trúc dữ liệu thuật toán là học phần rất quan trọng đối với người lập trình. Môn học này được xem như nền tảng của lập trình máy tính. Nó là cơ sở vững chắc để giải quyết một số bài toán, đồng thời cung cấp cho chúng ta hiểu biết về các giải thuật tác động lên dữ liệu, cũng như cách tổ chức dữ liệu để giải quyết các bài toán sao cho hiệu quả tối ưu. Sau hai học phần lí thuyết thực hành, chúng em nghiên cứu thực hiện đồ án này như là một cách để cũng cố mở rộng kiến thức. Thông qua quá trình thực hiện đồ án, chúng em đã nắm bắt được những kỹ thuật quan trọng của việc xây dựng cấu trúc dữ liệu cách xây dựng một thuật toán sau cho tối ưu nhất. Bài toán “Gelfand’s play” mà em nghiên cứu trình bày trong báo cáo sau đây là một trong những ví dụ. Chúng em chân thành cảm ơn thầy Lê Quý Lộc đã giúp đỡ em thực hiện đồ án này. chúng em cũng rất mong sự góp ý giúp đỡ từ phía thầy để bài làm của chúng được hoàn thiện hơn. Đồ án Cấu trúc dữ liệu Thuật toán Nhóm 11 Lớp 10T1 Trang 4 / 25 ĐỀ BÀI: Gelfand’s play Bàn cờ kích thước n x n đặt chéo. Một con tốt nằm ở đỉnh dưới. Hai người lần lượt đẩy con tốt đi một nước. Không được đi lùi lại. Người đầu tiên đặt được con tốt sang đầu ngược lại là người thắng cuộc. Tìm thuật toán tối ưu cho người đi nứơc đầu tiên. (Gelfand’s play). Đồ án Cấu trúc dữ liệu Thuật toán Nhóm 11 Lớp 10T1 Trang 5 / 25 PHÂN TÍCH THIẾT KẾ THUẬT TOÁN I. Phân tích bài toán Các trò chơi đối kháng giữa hai người đã được hình thành từ lâu. những người chơi luôn cố gắng tìm mọi cách để mình giành được phần thắng. Khi chơi, người chơi thường cố suy nghĩ để có một nước đi tối ưu nhất. Vấn đề là các trò chơi thường quá phức tạp lên không có một ai có thể đảm bảo rằng mọi nước đi của mình là tối ưu. Do vậy cho đến nay, chỉ một số lượng nhỏ bài toán đó đã được giải quyết. Bài toán “Gelfand’s play” này cũng là một dạng nhỏ của trò chơi đối kháng. Nó tương đối đơn giản vì chỉ có một quân cờ một cách đi (đi qua 3 ô kề bên cạnh). Vì vậy ta có thể xác định được một nước đi trong trò chơi sẽ dẫn đến kết quả thắng, thua cho người đi nước đó. Sau đây là thuật toán để giải quyết vấn đề này. II. Xây dựng thuật toán Trong các hình vẽ dưới đây, các ô trong bàn cờ được đánh số 0, 1, 2 như sau: -Số 0: Vị trí xuất phát ban đầu. -Số 1: Vị trí mà người chơi 1 (người đi nước đầu tiên) di chuyển quân tốt đến. -Số 2: Vị trí mà người chơi 2 (người đi sau) di chuyển quân tốt đến. Để tìm thuật toán tối ưu cho người chơi 1 (khả năng thắng của người chơi 1 là cao nhất). Ta xét một số trường hợp cụ thể như sau: 1. Bàn cờ 2×2 Dễ thấy rằng người chơi đầu đi chéo thắng. Vậy với bàn cờ kích thước 2×2 thì ta có thuật toán cho người chơi đầu tiên luôn thắng. 2. Bàn cờ 3×3 Trường hợp 3.1: Nếu người chơi 1 đi chéo thì quân cờ sẽ đến kề với ô đích, người chơi 2 sẽ di chuyển quân cờ về đích thắng. Do đó người chơi 1 không đi theo cách này. 1 0 2 1 0 Đồ án Cấu trúc dữ liệu Thuật toán Nhóm 11 Lớp 10T1 Trang 6 / 25 Trường hợp 3.2: Trường hợp 3.3: Trường hợp 3.4: Ta thấy rằng, khi người chơi 1 đi về phía trước thì sau đó sẽ xảy ra nhiều trường hợp hơn, do đó khả năng thắng cuộc cao hơn. Người chơi 1 ưu tiên di theo cách này. Vậy với bàn cờ 3×3 thì kết quả thắng, thua tùy thuộc vào các bước đi của người chơi 2. Do đó ta không có thuật toán tối ưu cho người chơi 1 luôn thắng (chỉ có thuật toán để người chơi 1 có khả năng thắng cao hơn).  Ta cũng cũng nhận thấy rằng, như vậy sẽ có thuật toán tối ưu chơ người chơi 2 luôn thắng trong trường hợp bàn cờ 3×3. 3. Bàn cờ 4×4 1 2 0 1 0 2 1 1 0 2 1 2 1 0 Đồ án Cấu trúc dữ liệu Thuật toán Nhóm 11 Lớp 10T1 Trang 7 / 25 Ta đã rút ra được kết luận là có thuật toán tối ưu để người chơi 2 luôn thắng trong bàn cờ 3×3, điều này cũng tương đương với có thuật toán tối ưu để người di chuyển quân tốt đến ô 3×3 (ô được đánh số 1 trên hình vẽ). Với bàn cờ 4x4 thì người chơi 1 đi chéo trong nước đi đầu tiên, khi đó sẽ trở thành trường hợp bàn cờ 3×3 với người chơi 2 đi trước. Từ kết luận ở trên thì người chơi 1 thắng.  Vậy với bàn cờ 4×4 ta có thuật toán tối ưu cho người đi nước đầu tiên luôn thắng. 4. Bàn cờ 5×5 Nếu nước đi đầu tiên của người chơi 1 đi chéo thì sẽ trở thành trường hợp bàn cờ 4×4 với người chơi 2 đi trước,và người chơi 2 thắng. Do đó người chơi 1 sẽ không đi chéo trong trường hợp này mà đi thẳng hoặc sang phải. Trường hợp 5.1: 1 0 1 1 2 0 0 Đồ án Cấu trúc dữ liệu Thuật toán Nhóm 11 Lớp 10T1 Trang 8 / 25 Trường hợp 5.2: Trường hợp 5.3: Trường hợp 5.4: Tương tự như đối với bàn cờ 3×3, bàn cờ 5×5 cũng có một số trường hợp đặc biệt như trên. Kết quả thắng, thua tùy thuộc vào các bước đi của người chơi. Ta không có được thuật toán tối ưu để người chơi 1 luôn thắng mà chỉ có thuật toán để tăng 2 1 1 0 1 2 1 2 1 1 2 1 0 2 1 2 1 2 1 2 1 0 Đồ án Cấu trúc dữ liệu Thuật toán Nhóm 11 Lớp 10T1 Trang 9 / 25 thêm số bước di chuyển nhằm tận dụng sơ hở của người chơi 2 để có được khả năng thắng cao nhất. 5. Với n>5 Với bàn cờ n×n trong đó n lớn thì ta tìm cách đưa về trường hợp với bàn cờ nhỏ hơn, rồi xét đến các trường hợp đặc biệt ở trên. Để đưa về bàn cờ với n nhỏ hơn ta xây dựng thuật toán để 2 người chơi di chuyển quân cờ men theo đường chéo phụ của bàn cờ. Khi quân cờ đang ở trên đường chéo phụ thì tiếp tục đi chéo, nếu người chơi 2 di chuyển quân cờ lệch khỏi đường chéo phụ thì người chơi 1 di chuyển quân cờ trở về lại đường chéo phụ. Kiểm tra đối chiếu so với các trường hợp đặc biệt ở trên để sau đó có nước đi phù hợp cho người chơi 1. III. Nhận xét Tại một ô của bàn cờ có tối đa 3 cách đi. Với các ô nằm ở biên trên biện phải của bàn cờ sẽ chỉ có 1 cách đi. Với bàn cờ n×n (n chẵn) thì ta có thuật toán để người chơi 1 luôn thắng. Với bàn cờ n×n (n lẻ) thì ta có thuật toán để người chơi 1 có khả năng thắng cao nhất. IV. Thiết kế chương trình 1. Input: N là kích thước của bàn cờ (bàn cờ dạng ma trận vuông. Vị trí xuất phát của quân tốt là ô góc trái phía dưới. 2. Output: Tìm đường đi tối ưu cho người chơi. Ở đây ta sẽ lập trình trò chơi giữa người chơi máy, tìm đường đi để máy luôn thắng 3. Thuật toán tìm đường đi cho máy Ta đưa bài toán về dạng đồ thị. Trong đó mỗi đỉnh v của đồ thị là một ô trong bàn cờ. Đồ án Cấu trúc dữ liệu Thuật toán Nhóm 11 Lớp 10T1 Trang 10 / 25 Quá trình chơi tương ứng với việc thêm các dấu mũi tên (in đậm) vào các cạnh để chuyển đồ thị về dạng có hướng với quy tắc: - Ô xuất phát chỉ có mũi tên đi ra mà không có mũi tên đi vào. - Tại mỗi đỉnh không phải đỉnh xuất phát chỉ có một mũi tên đi vào duy nhất. - Tại mỗi đỉnh đã có mũi tên đi vào phải có chỉ có một mũi tên đi ra. - Quá trình chơi kết thúc nếu tại một đỉnh không thể thêm dấu mũi tên phù hợp với quy tắc. Tức là không thể vẽ mũi tên đi ra cho đỉnh đó * Cấu trúc dữ liệu -Ta có thể biểu diễn đồ thị trên bằng 2 biến toàn cục i j. Hai biến này chỉ vị trí hiện tại mà quân cờ đang đứng. -Vị trí bắt đầu i=n j=1. Vị trí kết thúc i=1 j=n. -Khi quân cờ đến vị trí kết thúc thì thuật toán dừng. * Thuật toán tìm đường đi cho máy Ở đây ta xây dựng một chương trình chơi giữa máy (COM) người sử dụng (MAN). Để thể hiện độ tối ưu của thuật toán, ta thiết kế để máy có khả năng thắng là cao nhất. - Tại mỗi nước đi, thực hiện thao tác sau để chọn đường đi: + Khi n>5: Nếu i==n-j+1 thì đi chéo, nếu i<n-j+1 thì sang phải nếu i>n-j+1 thì đi lên trước. Khi N<=5 thì đối chiếu các trường hợ đặc biệt để cs nước đi phù hợp. + Kết quả: máy luôn thắng với n chẵn. V. Các hàm sử dụng trong chương trình 1. Các hàm khởi tạo void luat_choi(); //Giới thiệu luật chơi, chọn kích thước bàn cờ. 2. Hàm phục vụ thao tác chơi Void play(); //xác định lượt chơi của người hay máy, gọi hàm tương ứng void play_computer(); //Lượt đi của máy void play_player(); //Lượt đi của người chơi void move(int k); //Di chuyển quân cờ int kiemtra(); //Kiểm tra điều kiện thắng, nếu thắng trả về giá trị 1 3. Các hàm đồ họa sử dụng làm giao diện trò chơi sử dụng graphics.h . outtextxy(startx, starty-30, s); } void kd_dohoa() //khoi dong man hinh do hoa { initwindow(maxx, maxy); } void kt_dohoa() //dong man hinh do hoa { closegraph(); } void. //to mau quan co } void xoa_quan_co() //Xoa vi tri cu cua quan so bang cach to mau trung voi mau cua ban co { if((i+j)%2) ve_quan_co(15); else ve_quan_co(0);

Ngày đăng: 23/12/2013, 12:47

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan