1. Phát biểu bài toán
TÁM QUÂN HẬU ĐƯỢC ĐẶT LÊN BÀN CỜ VUA sao cho chúng không ăn được nhau .
toán này là một ví dụ nổi tiếng về việc dùng các phương pháp thử và sai và phương pháp quay lui. Bài
2. Thiết kế thuật toán
Mấu chốt của thuật toán rõ ràng là xét xem có th như thế nào. Theo luật cờ vua, một quân hậu có thể ăn cá
ể đặt quân hậu tiếp theo c quân khác nếu nằm trên cùng 1 đường, đường này có thể là :
a tọa độ vị trí của hậu).
cột j. :
Chỉ quân hậu thứ i : nằm ở hàng i.
- Hàng,
- Cột,
- Các đường chéo (đi qu
Suy ra rằng mỗi hàng chỉ có thể chứa 1 và chỉ 1 quân hậu. Nên việc chọn vị trí cho quân hậu thứ i có thể giới hạn được ở hàng thứ i. Như thế tham số i trở thành chỉ hàng, và quá trình chọn vị trí cho quân hậu tiến hành trên toàn giá trị có thể có của các
Ta quy ước
x[i] = j // quân hậu thứ i đặt ở cột j;
ể qua ân hàng i) chấp nhận cột j thì cột j và 2 đường chéo qua ô i,j> ph ûi còn trống ( tức là không có quân hậu khác chiếm lĩnh)
ưu ý r ng tro chéo :
Đườn ngược (vuông góc với đường chéo chính) : tất cả các ô đều có ường chéo thuận (song song với đường chéo chính) : gồm tất cả các ô ,j) mà có hiệu các tọa độ (i-j) là hằng số.
Cột j Đường chéo (i + j) Đ ân hậu i (tre
< a L ằ ng 2 đường - g chéo tổng 2 tọa độ i và j là hằng; - Đ (i Đường chéo (i – j) Hàng i
Do đó ta sẽ chọn các mảng Boole 1 chiều ể biểu diễn ùc trạng đ ca thái này : a[j] = 1 : Có nghĩa là không có quân hậu nào ở cột.
có quân hậu nào ở đường chéo ngược (i+j) . có quân hậu nào ở đường chéo thuận (i- j) . Vì :
1 ≤ 16 Và -7 ≤ i - j ≤ 7. Nên
c[15];
øn trống nữa héo tương ứng cũng không còn c[ i - j ] = 0;//trống nữa .
là :
c đường chéo tương ứng trở thành trống j ] = 1;
1; b[i+j] = 1 : Có nghĩa là không c[i -j] = 1 : Có nghĩa là không
≤ i,j ≤ 8 ⇒ 2 ≤ i+j ta có thể khai báo :
int x[8], a[8], b[15],
Với các dữ liệu đã cho, thì lệnhđặt quân hậu sẽ thể hiện bởi : x[ i ] = j; // đặt quân hậu thứ i trên cột j.
a[ j ] = 0;//Khi đặt hậu tại cột j , thì cột j không co b[ i+ j ] = 0;//Các đường c
Còn lệnhDời quân hậu //Làm cho hàng i và cá
a[
b[ i+ j ] = 1; c[ i - j ] =
Còn điều kiện an toàn là ô có tọa độ ( i, j ) nằm ở hàng và các đường chéo g trị True). Do đó, có thể được thể hiện bởi biểu
y(i) ≡ for (j = 1; j <= 8; j++) i-j]) ;
ình trạng ban đầu còn trống cho hàng [j],
j, để tìm lời giải khác */ ;
chưa bị chiếm (được thể hiện bằn thức logic :
a[ji ] && b[ i + j ] && c[ i - j ] Tr
{
if (a[j] && b[i+j] && c[ { x[i] = j; a[j] = 0; b[i+j] = 0 c[i-j] = 0; if (i < 8 ) try (i+1); else Xuất(x); /* Sau khi in 1 lời giải xong,trả lại t a
ờng chéo i+j và đường chéo i- đư a[ j ] = 1 b[i+j] = 1; c[i-j] = 1; } } Ghi chú :
Thuật toán này tìm được tất cả 92 lơ
ø vì thuật toán không ghi nhận tính đối xứng.
øi giải. Thực ra là chỉ có 12 lời giải
n
khác nhau thật sự, đó la