1 Bài toánxếp8quânhậuBàitoánxếp8quânhậu 1. 1. Giới thiệu bài toán: Quânhậu trên bàn cờ Giới thiệu bài toán: Quânhậu trên bàn cờ Vua có thể ăn theo hàng, cột, đường chéo Vua có thể ăn theo hàng, cột, đường chéo chứa nó. Tìm cách đặt 8quânhậu trên bàn cờ chứa nó. Tìm cách đặt 8quânhậu trên bàn cờ sao cho không quân nào ăn được của quân sao cho không quân nào ăn được của quân nào nào 2. 2. Ý tưởng thuật toán: Một con hậuxếp ở một Ý tưởng thuật toán: Một con hậuxếp ở một vị trí bất kỳ trên bàn cờ thì để tìm được vị trí vị trí bất kỳ trên bàn cờ thì để tìm được vị trí của con hậu tiếp theo ta phải xét theo 3 của con hậu tiếp theo ta phải xét theo 3 hướng như hình sau: hướng như hình sau: 2 Mô hình bàitoán Mô hình bàitoán Các con hậu tiếp theo phải được chọn ở các vị trí không nằm trên các đường dọc, đường ngang và đường chéo của con các con hậu trước. 3 Các bước giải quyết bàitoán Các bước giải quyết bàitoán • Ta tìm vị trí để đặt cho con hậu thứ i, với con Ta tìm vị trí để đặt cho con hậu thứ i, với con hậu thứ i thì ta phải xét xem trên các hướng của hậu thứ i thì ta phải xét xem trên các hướng của nó sau đó tìm tiếp vị trí cho con hậu thứ i + 1. nó sau đó tìm tiếp vị trí cho con hậu thứ i + 1. • Nếu ở bước thứ i không tìm thấy vị trí đặt của Nếu ở bước thứ i không tìm thấy vị trí đặt của con hậu thì chúng ta phải quay lại xét đến vị trí con hậu thì chúng ta phải quay lại xét đến vị trí khác của con hậu thứ i – 1. khác của con hậu thứ i – 1. • Trường hợp suy biến của bàitoán là khi chúng Trường hợp suy biến của bàitoán là khi chúng ta đã đặt cho con hậu thứ 8 có nghĩa là cả 8 con ta đã đặt cho con hậu thứ 8 có nghĩa là cả 8 con hậu đã được xếp trên bàn cờ và thoả mãn điều hậu đã được xếp trên bàn cờ và thoả mãn điều kiện là các con hậu không thể ăn được nhau. kiện là các con hậu không thể ăn được nhau. 4 Bàitoán tìm đường đi bằng chu trình Bàitoán tìm đường đi bằng chu trình Hamilton Hamilton Giới thiệu bài toán: Một người khách du lịch muốn Giới thiệu bài toán: Một người khách du lịch muốn đi thăm n thành phố được đánh số từ 1 đến n. đi thăm n thành phố được đánh số từ 1 đến n. Mạng lưới giao thông giữa n thành phố này là 2 Mạng lưới giao thông giữa n thành phố này là 2 chiều và được cho bởi ma trận A[i,j] trong đó A[i,j] chiều và được cho bởi ma trận A[i,j] trong đó A[i,j] = 1 nếu có đường đi giữa thành phố i và thành = 1 nếu có đường đi giữa thành phố i và thành phố j, A[i,j] = 0 trong trường hợp ngược lại. Thiết phố j, A[i,j] = 0 trong trường hợp ngược lại. Thiết lập đường đi cho người khách thông báo tồn tại lập đường đi cho người khách thông báo tồn tại đường đi hoặc không tồn tại đường đi. đường đi hoặc không tồn tại đường đi. 5 Mô hình bàitoán Mô hình bàitoán • Chúng ta có file có n + 1 dòng như sau: Chúng ta có file có n + 1 dòng như sau: – Dòng 1: Ghi số nguyên dương là n thành phố Dòng 1: Ghi số nguyên dương là n thành phố – Dòng i + 1: (1 Dòng i + 1: (1 ≤i≤n ≤i≤n ): ghi n số nguyên không ): ghi n số nguyên không âm A[i,1] A[i,2]…A[i,n] cho biết có đường đi âm A[i,1] A[i,2]…A[i,n] cho biết có đường đi hay không giữa hai thành phố i và j (1 hay không giữa hai thành phố i và j (1 ≤j≤n ≤j≤n ). ). • Kết quả tồn tại hay không tồn tại đường đi. Kết quả tồn tại hay không tồn tại đường đi. 5 5 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 Kết quả: Chu trình Hamilton như sau: 1 3 2 4 5 1 6 Các bước giải quyết bàitoán Các bước giải quyết bàitoán • Tìm hết tất cả mọi khả năng của đường đi Tìm hết tất cả mọi khả năng của đường đi (Sau khi đi qua đường đi nào thì xoá bỏ (Sau khi đi qua đường đi nào thì xoá bỏ đường đi đó) và kiểm tra xem đường đi đường đi đó) và kiểm tra xem đường đi này có qua đủ n đỉnh của đồ thị hay này có qua đủ n đỉnh của đồ thị hay không. không. 7 Thủ tục mô tả thuật toán Thủ tục mô tả thuật toán Procedure Hamilton(k : byte); Procedure Hamilton(k : byte); var i : byte; var i : byte; Begin Begin if k = n + 1 then if k = n + 1 then inkq inkq else else for i := 1 to n do for i := 1 to n do if (a[c[k-1],i] > 0) and not(b[i]) then if (a[c[k-1],i] > 0) and not(b[i]) then begin begin a[c[k-1],i] := 0; a[c[k-1],i] := 0; c[k] := i; c[k] := i; b[i] := true; b[i] := true; hamilton(k+1); hamilton(k+1); a[c[k-1],i] := 1; a[c[k-1],i] := 1; c[k] := 0; c[k] := 0; b[i] := false; b[i] := false; end; end; End; End; . 1 Bài toán xếp 8 quân hậu Bài toán xếp 8 quân hậu 1. 1. Giới thiệu bài toán: Quân hậu trên bàn cờ Giới thiệu bài toán: Quân hậu trên bàn cờ. đặt 8 quân hậu trên bàn cờ chứa nó. Tìm cách đặt 8 quân hậu trên bàn cờ sao cho không quân nào ăn được của quân sao cho không quân nào ăn được của quân