Đồ án Giải thuật lập trình Sudoku 9x9 (Có code)

22 1.9K 21
Đồ án Giải thuật lập trình Sudoku 9x9 (Có code)

Đ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

Đồ án Giải thuật lập trình Sudoku 9x9 (Có code)Sudoku là một trò chơi câu đố sắp xếp chữ số dựa trên logic theo tổ hợp. Mục tiêu của trò chơi là điền các chữ số vào một lưới 9×9 sao cho mỗi cột, mỗi hàng, và mỗi phần trong số chín lưới con 3×3 cấu tạo nên lưới chính đều chứa tất cả các chữ số từ 1 tới 9

TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH Đề tài: GIẢI SUDOKU 9x9 GIẢNG VIÊN HƯỚNG DẪN: VÕ ĐỨC HOÀNG SINH VIÊN THỰC HIỆN: TRẦN VĂN HỒNG QUÂN LỚP: 16T3 NHÓM: 11C ĐỒN VĂN SINH LỚP: 16T3 NHĨM: 11C Đà Nẵng, 11/2018 Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình MỤC LỤC MỤC LỤC LỜI MỞ ĐẦU .2 DANH MỤC HÌNH VẼ GIỚI THIỆU ĐỀ TÀI CƠ SỞ LÝ THUYẾT 2.1 Ý tưởng 2.2 Cơ sở lý thuyết .6 TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN .6 3.1 Phát biểu toán 3.2 Cấu trúc liệu 3.3 Thuật toán Quay lui (Backtracking) .9 CHƯƠNG TRÌNH VÀ KẾT QUẢ 4.1 Tổ chức chương trình 10 4.2 Ngôn ngữ cài đặt 17 4.3 Kết 17 4.3.1 Giao diện chương trình 17 4.3.2 Kết thực thi chương trình 18 4.3.3 Nhận xét 20 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 21 5.1 Kết luận 21 5.2 Hướng phát triển 21 TÀI LIỆU THAM KHẢO 22 Trang Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình LỜI MỞ ĐẦU Đề tài Sudoku 9x9 sử dụng ngơn ngữ lập trình C thể thuật toán đệ quy quay lui cơng cụ lập trình DEV C++ để giải tốn Sudoku 9x9 cho trước Thơng qua báo cáo này, chúng em xin gửi lời cảm ơn đến thầy Võ Đức Hoàng – giảng viên hướng dẫn hỗ trợ tận tình giải đáp thắc mắc suốt trình làm đồ án Giải thuật Lập trình Tuy nhiên, kiến thức hạn hẹp, nỗ lực mình, đồ án khó tránh khỏi thiếu sót Chúng em mong nhận thơng cảmvà bảo tận tình quý Thầy cô bạn Xin chân thành cảm ơn Trang Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình DANH MỤC HÌNH VẼ Hình Ví dụ đề Sudoku 9x9 Hình Đáp án câu đố Hình Cây tìm kiếm quay lui Hình Mảng S Hình Giao diện chương trình Hình Đầu vào input.txt Hình Lựa chọn 1: Giải bước – Xem tiến trình bước – Đáp án Hình Lựa chọn 1: Giải bước - Xem tiến trình bước – Đáp án Hình Lựa chọn 2: Xem đáp án Hình 10 Lựa chọn 2: Xem đáp án Hình 11 So sánh kết đầu output Trang Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình GIỚI THIỆU ĐỀ TÀI Sudoku từ Nhật, dịch tạm số độc nhất, (Thật có nguồn gốc từ Mỹ với tên gọi "đặt số vào vị trí đúng") Đây trò chơi trí tuệ tiếng, thu hút nhiều người tham gia thuộc nhiều tầng lớp, độ tuổi khác Sudoku có nhiều biến thể khác nhau: 3x3, 4x4, 6x6, 8x8, 9x9, 12x12, 16x16,… Đối với đề tài này, chúng em áp dụng cho sudoku dạng chuẩn 9x9 Bảng câu đố hình vng, chiều có nhỏ, hợp thành cột, hàng chia thành ô lớn 3x3 Một vài nhỏ đánh số, manh mối để bạn tìm lời giải Tuỳ theo mức độ nhiều hay manh mối, câu đố xếp loại dễ, trung bình, khó hay cực khó Hình Ví dụ đề Sudoku 9x9 Cách chơi Sudoku điền số từ đến vào ô trống theo quy luật đơn giản: - Các ô hàng (ngang) phải có đủ số từ đến khơng cần theo thứ - tự Các ô hàng (dọc) phải có đủ số từ đến không cần theo thứ tự Mỗi miền 3x3 viền đậm phải có đủ số từ đến Trang Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình Hình Đáp án câu đố CƠ SỞ LÝ THUYẾT 2.1 Ý tưởng Chương trình giải dựa thuật tốn quay lui Bằng việc liệt kê tình huống, thử khả tìm thấy lời giải đúng, thuật toán quay lui chia nhỏ toán, lời giải toán lớn kết việc tìm kiếm theo chiều sâu tập hợp tốn phần tử Trong suốt q trình tìm kiếm gặp phải hướng mà biết khơng thể tìm thấy đáp án quay lại bước trước tìm hướng khác hướng vừa tìm kiếm Trong trường hợp khơng hướng khác thuật tốn kết thúc 2.2 Cơ sở lý thuyết 2.2.1 Thuật toán Quay lui (Backtracking) Quay lui chiến lược tìm kiếm lời giải cho toán thỏa mãn ràng buộc Các toán thỏa mãn ràng buộc tốn có lời giải đầy đủ, thứ tự phần tử khơng quan trọng Các tốn bao gồm tập biến mà biến cần gán giá trị tùy theo ràng buộc cụ thể toán Việc quay lui thử tất tổ hợp để tìm lời giải Thế mạnh phương pháp nhiều cài đặt tránh việc phải thử nhiều tổ hợp chưa hoàn chỉnh, nhờ giảm thời gian chạy, tìm nhiều đáp án cho tốn có nhiều cách giải Trang Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình Đó q trình tìm kiếm độ sâu tập hợp lời giải Trong trình tìm kiếm, ta gặp hướng lựa chọn không thỏa mãn, ta quay lui điểm lựa chọn nơi có hướng khác thử hướng lựa chọ Khi thử hết lựa chọn xuất phát từ điểm lựa chọn đó, ta quay lại điểm lựa chọn trước thử hướng lựa chọn Q trình tìm kiếm thất bại khơng điểm lựa chọn Quy trình thường cài đặt hàm đệ quy mà thể hàm lấy thêm biến gán tất giá trị cho biến đó, với lần gán giá trị lại gọi chuỗi đệ quy để thử biến Chiến lược quay lui tương tự với tìm kiếm theo độ sâu sử dụng khơng gian nhớ hơn, lưu trữ trạng thái lười giải cập nhật Hình Cây tìm kiếm quay lui - Ở tốn (mỗi nốt), ta tìm lời giả cho tốn Ứng với lời giải, ta giải toán toán gốc trở nên đầy đủ - Lời giải toán gốc thường lối từ gốc đến nốt cuối TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TỐN 3.1 Phát biểu tốn - Đầu vào : Đề Sudoku đọc bảng từ file , người dùng nhập - Đầu (Kết quả): Đáp án bước giải Sudoku chương trình đáp án tồn chương trình (có thể nhiều đáp án đầu vào có nhiều đáp án) Trang Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình 3.2 Cấu trúc liệu Biến Sử dụng biến kiểu mảng hai chiều để thể vị trí phần tử xét Mảng hai chiều mảng mà phần tử mảng chiều, giống bảng gồm có dòng cột, đánh dấu vị trí số bao gồm số dòng số cột Trong ngơn ngữ C, mảng hai chiều khai báo theo cú pháp: data_type array_name[num1][num2]; - với data_type kiểu liệu phần tử mảng - num1 số mảng chiều có mảng - num2 số phần tử có mảng chiều Ví dụ mảng hai chiều S khai báo sau: int S[9][9]; Khi mảng S giống bảng có hàng cột (mỗi hàng có phần tử), phần tử mảng số kiểu int 8 Hình Mảng S Muốn truy cập đến phần tử mảng ta dùng cú pháp S[i][j] Khi S[i][j] chứa giá trị vị trí hàng i cột j Hàm Trang Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình Trong mảng hai chiều đưa vào chương trình, phần tử mảng tương ứng với ô đề Sudoku Trong mảng này, ô chưa điền nhận giá trị 0, ô điền mang giá trị điền vào Với ô chưa điền, giá trị Khi để kiểm tra khả điền giá trị ô ta dùng hàm check() sau: - Kiểm tra hàng: Kiểm tra giá trị k (với k nhận giá trị từ 1-9) điền vào hay khơng Kiểm tra xem hàng có có giá trị k hay chưa cách duyệt hết tất phần tử hàng đó, có loại bỏ khả ô nhận giá trị k - Kiểm tra cột: Kiểm tra giá trị k (với k nhận giá trị từ 1-9) điền vào khơng Kiểm tra xem cột có ô mang giá trị k chưa cách duyệt hết tất phần tử có cột, có loại bỏ khả nhận giá trị k - Kiểm tra vùng ô: với giá trị k có giá trị từ đến Kiểm tra xem vùng ô có chứa giá trị k chưa, có loại trừ khả nhận giá trị k ô - Nếu với số k sau kiểm tra đạt khả gán giá trị k cho Trong tham số truyền vào là: + Mảng S[][] mảng xét + Số nguyên x chứa vị trí dòng xét mảng + Số ngun y chứa vị trí cột xét + k giá trị muốn kiểm tra xem điền vào xét hay khơng Hàm trả giá trị k điền vào ô xét trả không điền vào ô xét Hàm sovle() thực thuật tốn quay lui Hàm có tham số đầu vào: mảng liệu S, biến vị trí x,y Chương trình duyệt mảng hai chiều, chương trình kiểm tra xem ô điền hay chưa, chưa điền chương trình duyệt hết tất giá trị k chạy từ 1- xem giá trị điền vào xét Tại ứng với giá trị điền vào ô xét chương trình gọi đệ quy đến ô hàng Nếu trường hợp giá trị điền trước mà khơng thể điền giá trị chương trình quay lui lại thử với giá trị khác Cứ Trang Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình xét xong cuối mảng (ô thứ 81) Tại chương trình xuất kết kết thúc chương trình 3.3 Thuật tốn 3.3.1 Thuật tốn quay lui Thuật tốn quay lui (backtracking) tên gọi nó, trình tìm kiếm mà trình tìm kiếm, ta gặp hướng lựa chọn không thỏa mãn, ta quay lui điểm lựa chọn nơi có hướng khác thừ hướng lựa chọn Q trình tìm kiếm thất bại khơng điểm lựa chọn Độ phức tạp: Trong trường hợp xấu độ phức tạp quay lui cấp số mũ Vì mắc phải nhược điểm sau:  Rơi vào tình trạng "thrashing": trình tìm kiếm gặp phải bế tắc với nguyên nhân  Thực công việc dư thừa: Mỗi lần quay lui, cần phải đánh giá lại lời giải đơi lúc điều khơng cần thiết  Không sớm phát khả bị bế tắc tương lai Quay lui chuẩn, khơng có chế nhìn tương lai để nhận biết nhánh tìm kiếm vào bế tắc CHƯƠNG TRÌNH VÀ KẾT QUẢ 4.1 Tổ chức chương trình #include #include #include int c=0; char N[10] = {'_', '1', '2','3', '4', '5', '6', '7', '8', '9'}; Trang Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình int S[9][9]; void show(int S[][9]); void gotoxy(int x, int y); void setcolor(int color); void tientrinh(int i, int j, int k,int color); int readFile(FILE *f); void getData(int S[][9]); void option1_solve_sudoku(int S[9][9], int x, int y); void option2_solve_sudoku(int S[9][9], int x, int y); int check(int S[][9], int x, int y, int k); void Output(int S[][9]); void resuilt(int S[][9]); void main(void){ getData(S); int index; int t=1; show(S); printf("\n\n"); while (t) { printf(" -SUDOKU -\n"); printf("1 Xem tien trinh : \n"); printf("2 Xem dap an : \n"); printf(" \n"); printf("Nhap lua chon:"); scanf("%d",&index); switch (index) { case 1: option1_solve_sudoku(S,0,0); break; case 2: option2_solve_sudoku(S,0,0); c=0; Trang 10 Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình break; case 0: t=0; break; default : break; } } } // ham gotoxy void gotoxy(int x, int y) { static HANDLE h = NULL; if(!h) h = GetStdHandle(STD_OUTPUT_HANDLE); COORD c = { x, y }; SetConsoleCursorPosition(h,c); } // ham thiet lap mau chu void setcolor(int color) { HANDLE hConsoleColor; hConsoleColor = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hConsoleColor, color); } // ham tien trinh void tientrinh(int i, int j, int k, int color) { int size= 4; gotoxy(j*size, i*(size-2)); setcolor(color); printf("%c", N[k]); Trang 11 Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình } // ham doc file int readFile(FILE *f){ int n; fscanf(f,"%d", &n); return n; } // ham chuyen du lieu file qua mang S void getData(int S[][9]) { int A[81]; int count = 0; FILE *f; f = fopen("Input.txt", "r"); while (!feof(f)){ A[count] = readFile(f); count++; } int t = 0; int i, j; for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) { S[i][j] = A[t]; t++; } } fclose(f); } // lua chon tien trinh giai sudoku void option1_solve_sudoku(int S[9][9], int x, int y){ Sleep(400); if(y == 9){ if(x == 8){ Trang 12 Đề tài: Giải Sudoku 9x9 Đồ án Giải thuật Lập trình setcolor(12); gotoxy(60, c*20+1); printf("DAP AN %d:\n\n",c+1); resuilt(S); system("pause"); Output(S); c++; } else { option1_solve_sudoku(S, x+1,0); } } else if(S[x][y] == 0){ int k = 0; for (k = 1; k

Ngày đăng: 31/03/2020, 00:08

Từ khóa liên quan

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

Tài liệu liên quan