Tải bản đầy đủ (.doc) (32 trang)

Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (453.71 KB, 32 trang )

ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

LỜI NÓI ĐẦU
Ngày nay công nghệ thông tin đóng vai trò cực kỳ quan trọng và trở thành
một phần không thể thiếu trong đời sống. Việc ứng dụng một cách rộng rãi vào mọi
lĩnh vực đã đem lại hiệu quả, năng suất công việc khá cao. Điều đó đòi hỏi ngày
càng cải tiến công nghệ, tối ưu hóa thuật toán để phát triển nhiều tính năng hơn nữa.
Có rất nhiều công cụ, môn học để giải quyết vấn đề này. Một trong những môn học
nền tảng quan trọng ảnh hưởng trực tiếp đến thuật toán đó là “Cấu trúc dữ liệu và
thuật toán”.
Để có thể đi sâu và nắm vững một cách có hệ thống kiến thức đã thu nhận
được trong quá trình học môn “Cấu trúc dữ liệu” nhóm em chọn đề tài “Sắp xếp các
quân hậu trên bàn cờ vua sao cho chúng quản lý tất cả cáo vị trí trên bàn cờ. ”
để tìm hiểu và nghiên cứu.
Trong quá trình thực hiện đồ án, chúng em xin chân thành cảm ơn sự hướng
dẫn tận tình của thầy Phan Chí Tùng đã giúp đỡ chúng em hoàn thành tốt đồ án môn
học này.

Nhóm 3

Nhóm 3

Trang 1/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU


GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

MỤC LỤC
LỜI NÓI ĐẦU

1

MỤC LỤC

2

CHƯƠNG I. TỔNG QUAN ĐỀ TÀI

8

1.1. Mục tiêu đề tài.

8

1.2. Hướng giải quyết.

8

Tính toán độ phức tạp của thuật toán.

8

CHƯƠNG II. CƠ SỞ LÝ THUYẾT


9

2.1. Giới thiệu.

9

2.2. Lịch sử

9

2.3. Tính chất số học của lời giải.

10

2.4. Số lời giải cho bài toán n quân hậu

11

CHƯƠNG III. PHÂN TÍCH VÀ XÂY DỰNG

12

CHƯƠNG TRÌNH

12

3.1. Phân tích đề tài.

12


In put:

12

Nhập số hậu cần sắp xếp trong bàn cờ.

12

Output:

12

3.2. Thuật toán.

12

Có một giải thuật đơn giản tìm một lời giải cho bài toán n quân hậu với n = 1 hoặc n ≥ 4: 12
Ví dụ :

13

Giải thuật đệ quy và quay lui tìm kiếm tất cả các lời giải

15

Mã giả.......................................................................................................................................16
3.3. Cấy tìm kiếm trong giải thuật

18


3.4. Xây dựng chương trình.

19

3.4.1. Khởi tạo

19

for( i=1;i<=n;i++)

19

Nhóm 3

Trang 2/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ
Test_Col[i]=0; //khoi tao cho cot i con trong

19

for(j=2;j<=2*n;j++)

19


Test_Up[j]=0; //khoi tao cho duong cheo tren con trong

19

for (k=1;k<=2*n-1;k++)

19

Test_Down[k]=0; //khoi tao cho duong cheo duoi con trong

19

for (i=1;i<=n;i++)

19

Hau[i]=0;

19

for (i=0;i
19

S[i]=0; // trang thai cho ban co, neu S[i]=0 thi tu hang i->tro ve truoc ban co chua thay doi 19
3.4.2. Code hàm main

19


row=1;

19

while(row>0)

19

{

19

// Neu S[row-1]=0, Vi tri cua quan co cua hang row-1 chua thay doi

19

if(S[row-1]==0)

19

{

19

for(col=Hau[row]+1;col<=n;col++)

19

{


19

if(int ok=Test(row,col)==0)

19

{

19

Insert(row,col);

20

S[row]=1;

20

break;

20

}

20

}

20


}

20

else

20

Nhóm 3

Trang 3/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ
{

20

for(col=1;col<=n;col++)

20

{

20


if(int ok=Test(row,col)==0)

20

{

20

Insert(row,col);

20

S[row]=1;

20

S[row-1]=0;

20

break;

20

}

20

}


20

}

20

if(row!=n&&col<=n) row++;

20

else {

20

if(row==n&&col<=n)

20

{

20

count++;

20

printf("\n | %3d.",count);

21


for (i=1;i<=n;i++)

21

printf("%3d",Hau[i]);

21

Remote(row,Hau[row]);//lay lai o cua quan hau hang cuoi cung

21

}

21

row--;

21

Remote(row,Hau[row]);

21

}

21

}


21

printf("\n | So cach xep la %d",count);

21

Nhóm 3

Trang 4/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ
3.4.3. Hàm chèn “Hậu” vào hang và cột

21

void Insert(int r, int c)

21

{

21

Hau[r]=c;


21

Test_Col[c]=1;

21

Test_Up[c+r]=1;

21

Test_Down[r-c+n]=1;

21

}

21

3.4.4. Hàm kiểm tra “Hậu” ở hàng và cột

22

/*ham kiem tra o hang r, cot c co chap nhan hay khong*/

22

/* ham tra ve 0 neu chap nhan va tra ve 1 neu nguoc lai*/

22


int Test(int r,int c)

22

{

22

int ok;

22

if(Test_Col[c]==0&&Test_Up[c+r]==0&&Test_Down[r-c+n]==0)

22

return ok=0;

22

else return ok=1;

22

}

22

3.4.5. Hàm lấy lại “Hậu” ở hang và cột


22

void Remote(int r, int c)

22

{

22

Test_Col[c]=0;

22

Test_Up[c+r]=0;

22

Test_Down[r-c+n]=0;

22

}

22

3.5. Kết Quả chương trình.

23


Hiển thị khi chạy:

23

Nhóm 3

Trang 5/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ
23
Kết quả các cách sắp xếp 6 “Hậu”

23

Kết quả các cách sắp xếp 7 “Hậu”

24
24

Chương trình Mô phỏng bằng VB:
CHƯƠNG IV. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN

25
26


4.1. Kết quả đạt được.

26

4.2. Hạn chế.

26

4.3. Hướng phát triển.

26
31

LỜI NHẬN XÉT CỦA GIÁO VIÊN

32
32
32
32
32
32
32
32
32
32
32
32
32
32
32

32
32

Nhóm 3

Trang 6/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ
32
32
32
32
32
32
32
32

Nhóm 3

Trang 7/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG


Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

CHƯƠNG I.

TỔNG QUAN ĐỀ TÀI

1.1. Mục tiêu đề tài.
Tìm hiểu về cách “Sắp xếp các quân hậu trên bàn cờ vua sao cho chúng
quản lý tất cả cáo vị trí trên bàn cờ.”.
Xây dựng chương trình để kiểm tra các quân hậu trên bàn cờ vua.
Tìm hiểu về độ phức tạp của thuận toán.

1.2. Hướng giải quyết.
Sử dụng ngôn ngữ C xây dựng chương trình.
Xây dựng thuật toán để kiểm tra “Sắp xếp các quân hậu trên bàn cờ vua
sao cho chúng quản lý tất cả cáo vị trí trên bàn cờ.”.
Tính toán độ phức tạp của thuật toán.

Nhóm 3

Trang 8/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ


CHƯƠNG II.

CƠ SỞ LÝ THUYẾT

2.1. Giới thiệu.

Một trong các lời giải
Bài toán sắp xếp quân hậu là bài toán đặt các quân hậu trên bàn cờ vua kích
thước 8×8 sao cho không có quân hậu nào có thể "ăn" được quân hậu khác, hay nói
khác đi không quân hậu nào có để di chuyển theo quy tắc cờ vua. Màu của các quân
hậu không có ý nghĩa trong bài toán này. Như vậy, lời giải của bài toán là một cách
xếp tám quân hậu trên bàn cờ sao cho không có hai quân nào đứng trên cùng hàng,
hoặc cùng cột hoặc cùng đường chéo. Bài toán tám quân hậu có thể tổng quát hóa
thành bài toán đặt n quân hậu trên bàn cờ n×n(n ≥ 4).

2.2. Lịch sử
Bài toán được đưa ra vào 1848 bởi kỳ thủ Max Bezzel, và sau đó nhiều nhà toán
học, trong đó có Gauss và Georg Cantor, có các công trình về bài toán này và tổng
Nhóm 3

Trang 9/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

quát nó thành bài toán xếp hậu. Các lời giải đầu tiên được đưa ra bởi Franz Nauck

năm 1850. Nauck cũng đã tổng quát bài toán thành bài toán n quân hậu. Năm 1874,
S. Gunther đưa ra phương pháp tìm lời giải bằng cách sử dụng định thức, và J.W.L.
Glaisher hoàn chỉnh phương pháp này.
Bài toán này cũng được ứng dụng trong trò chơi máy tính The 7th Guest vầo
những năm 1990.

2.3. Tính chất số học của lời giải.
Ký hiệu quân hậu đứng ở ô nằm trên hàng thứ i của lời giải là Q[i, j]. Các chỉ
số dòng cột đánh từ trên xuống dưới, trái sang phải theo cách đánh số trong ma
trận). Trong một ma trân vuông:


các phần tử nằm trên cùng hàng có chỉ số hàng bằng nhau;



các phần tử nằm trên cùng cột có chỉ số cột bằng nhau;



các phần tử nằm trên cùng một đường chéo song song với đường chéo

chính có hiệu chỉ số hàng với chỉ số cột bằng nhau;


các phần tử nằm trên cùng một đường chéo song song với đường chéo

phụ có tổng chỉ số hàng với chỉ số cột bằng nhau;
Vì thế ta gọi các đường chéo song song với đường chéo chính là đường chéo trừ
(hay hiệu), các đường chéo song song với đường chéo phụ là đường chéo cộng (hay

tổng).
Do đó, mỗi lời giải có thể được biểu diễn bởi dãy Q[1,i 1],Q[2,i2],...,Q[n, in],thỏa
mãn các điều kiện:


Các chỉ số cột i1, i2,..., in đôi một khác nhau, hay chúng lập thành một

hoán vị của các số 1, 2,.., n.


Tổng chỉ số dòng và cột của các quân hậu 1+i 1, 2+i2,..., n+in đôi một

khác nhau;


Hiệu chỉ số dòng và cột của các quân hậu 1-i 1, 2-i2,...,n-in đôi một khác

nhau.
Nhóm 3

Trang 10/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

Chẳng hạn lời giải cho trong hình trên biểu diễn bới dãy ô (1 ,4),(2, 7), (3, 3), (4,

8), (5,2), (6,5), (7,1), (8,6). Ta có thể kiểm tra các điều kiện trên trong bảng:
i

1

2

3

4

5

6

7

8

j

4

7

3

8

2


5

1

6

i+j

5

9

6

12

7

11

8

14

i-j

-3

-5


0

-4

3

1

6

2

2.4. Số lời giải cho bài toán n quân hậu
Ta có bảng sau đây cho n quân hậu, cả (sequence A002562 in OEIS) và
(sequence A000170 in OEIS).
n

1

2

3

4

5

6


7

8

..

số lời giải

1

0

0

2

10

4

40

92

..

Lưu ý rằng bài toán với 6 quân hậu có ít lời giải hơn bài toán với 5 quân hậu.
Hiện nay chưa có công thức về số lượng chính xác lời giải.

Nhóm 3


Trang 11/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

CHƯƠNG III.

PHÂN TÍCH VÀ XÂY DỰNG
CHƯƠNG TRÌNH

3.1.

Phân tích đề tài.

 In put:
 Nhập số hậu cần sắp xếp trong bàn cờ.
 Output:
 Thông báo ra màn hình vị trí của quân hậu trên bàn cờ và số cách sắp
xếp.

3.2.

Thuật toán.

Có một giải thuật đơn giản tìm một lời giải cho bài toán n quân hậu với n = 1

hoặc n ≥ 4:
1. Chia n cho 12 lấy số dư r. (r= 8 với bài toán tám quân hậu).
2. Viết lần lượt các số chẵn từ 2 đến n.
3. Nếu số dư r là 3 hoặc 9, chuyển 2 xuống cuối danh sách.
4. Bổ sung lần lượt các số lẻ từ 1 đến n vào cuối danh sách, nhưng nếu r là 8,
đổi chỗ từng cặp nghĩa là được 3, 1, 7, 5, 11, 9, ….
5. Nếu r = 2, đổi chỗ 1 và 3, sau đó chuyển 5 xuống cuối danh sách.
6. Nếu r = 3 hoặc 9, chuyển 1 và 3 xuống cuối danh sách.
7. Lấy danh sách trên làm danh sách chỉ số cột, ghép vào danh sách chỉ số dòng
theo thứ tự tự nhiên ta được một lời giải của bài toán.
Sau đây là một số ví dụ


14 quân hậu (r = 2): 2, 4, 6, 8, 10, 12, 14, 3, 1, 7, 9, 11, 13, 5.



15 quân hậu (r = 3): 4, 6, 8, 10, 12, 14, 2, 5, 7, 9, 11, 13, 15, 1, 3.

Nhóm 3

Trang 12/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ



20 quân hậu (r= 8): 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 3, 1, 7, 5, 11, 9, 15, 13,
19, 17.

Ví dụ :
Bài toán tám quân hậu có 92 lời giải khác nhau. Nếu không phân biệt các lời giải
là ảnh của nhau qua phép đối xứng, phép quay bàn cờ thì chúng chỉ có 12 lời
giải đơn vị như biểu diễn dưới đây:

Nhóm 3

Trang 13/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

Nhóm 3

Trang 14/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ


Lời giải 1

Lời giải 2

Lời giải 3

Lời giải 4
Giải thuật đệ quy và quay lui tìm kiếm tất
cả các lời giải
Lời giải thứ nhất của bài toán 11 hậu khi tìm
bằng giải thuật đệ quy và quay lui trong mục
này. Đối xứng với lời giải bên dưới.

Lời giải thứ 2680 của bài toán 11 hậu khi tìm
bằng giải thuật đệ quy và quay lui trong mục
này. Đối xứng với lời giải thứ nhất.

Nhóm 3

Trang 15/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

Trong giải thuật này, mỗi lời giải được ký hiệu bằng một mảng solution[1..n],

trong đó solution[i]= j là cột mà quân hậu ở hàng thứ i đứng. Theo tính chất số học
của các ô trên bàn cờ n x n, các ô trên các đường chéo cộng chứa ô (i, j) đều có tổng
chỉ số hàng với chỉ số cột bằng i+j. Tổng này nhận các giá trị từ 2 đến 2n nên ta
đánh số các đường chéo này từ 1 đến 2n-1. Như vậy các ô trên đường chéo cộng thứ
nhất có tổng chỉ số dòng và cột là 2, các ô trên đường chéo thứ k có tổng ấy là k+1.
Ta dùng một mảng Boolean Ok_plus[1..2n-1] để kí hiệu trạng thái đã có quân hậu
nào trên đường chéo cộng thứ k chưa, nghĩa là Ok_plus[k]=True nếu đã có một quân
hậu đứng chiếm giữ đường chéo cộng thứ k. Tương tự, các ô trên một đường chéo
trừ có hiệu như nhau. Hiệu này nhận giá trị từ 1-n đến n- 1. Đánh số từ 1 đến 2n-1 từ
đường chéo có hiệu chỉ số dòng trừ chỉ số cột là 1-n đến đường chéo có hiệu ấy
bằng n-1. Khi đó đường chéo trừ thứ k có hiệu chỉ số dòng trừ chỉ số cột là k-n. Ta
cũng dùng mảng ok_minus[1..2n-1] để chỉ trạng thái của các đường chéo này.
Giải thuật này cố gắng đặt quân hậu ở dòng thứ i vào cột nào đó, bắt đầu từ dòng
thứ nhất (luôn có thể đặt được). Nếu ở dòng thứ i ta đặt quân hậu vào cột thứ j, thì
nó khống chế tất cả các ô trong cột thứ j, đường chéo cộng thứ i+j-1, đường chéo trừ
thứ i-j+n. Nếu có thể đặt được quân hậu ở dòng i và i = n ta có một lời giải. Nếu đặt
được và i < n ta tiếp tục cố gắng đặt quân hậu tiếp theo vào dòng thứ i+1. Nếu không
đặt được, ta quay lại nhấc quân hậu ở dòng thứ i-1 và tìm phương án tiếp theo của
dòng thứ i-1.


Nhận xét: trong hai lời giải ở hình bên các vị trí của quân hậu trên bàn cờ
đứng theo vị trí nước đi của quân ngựa

Mã giả
Procedure Try_row(i)
For j=1 To n do
Nhóm 3

Trang 16/32



ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

If not ok_row(i) And not ok_col(j) And not ok_plus(i+j-1) And not
ok_minus(i-j+n) then
{
solution(i)=j;
ok_col(j)=True;
ok_plus(i+j-1)=True;
ok_minus(i-j+n)=True;
If itry_row(i+1)
ELSE print_solution();
ok_row(i)=False;
ok_col(j)=False;
ok_plus(i+j-1)=False;
ok_minus(i-j+n)=False;
}
Thủ tục tìm tất cả các lời giải của bài toán n hậu chỉ bao gồm một lời gọi
Try_row(1):
Procedure n_queen(n);
Call Try_row(1);

Nhóm 3


Trang 17/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

3.3.

Cấy tìm kiếm trong giải thuật

Cố gắng không thành công.

Cây tìm kiếm lời giải với n=4.
Ta minh họa quá trình tìm kiếm lời giải cho bài toán n hậu với n =4 trong hình
bên. Ở trạng thái xuất phát, trên dòng 1 có 4 lụa chọn cho quân hậu: quân hậu thứ
nhất có thể đứng ở các cột 1,2,3,4. Nếu lựa chọn Ô (1,1), ở dòng thứ hai chỉ còn hai
lựa chọn là cột 3 và cột 4. Nếu lựa chọn cột 3, trên dòng thứ 3 sẽ không còn ô nào
không bị khống chế (Ô (3,1)và (3,3) khống chế bởi (1,1), ô (3,2) và (3,4) khống chế
bởi (2,4). Ta loại bỏ phương án chọn ô (2,3) này và xét tiếp phương án chọn ô (2,4).
Khi lựa chọn ô(2,4) ta cũng chỉ đặt thêm được một quân hậu ở dòng thứ ba. Dòng
thứ tư lại không thể đặt bất kỳ quân hậu nào. Do đó ta lùi lại dòng thứ nhất, xét khả
năng tiếp theo (1,2), ta lần lượt được dãy các ô (1,2), (2,4), (3,1), (4,3). Tiếp tục với
ô(1,3), (1,4). Chỉ có hai đường đi từ gốc tới lá với độ dài 4 nên bài toán 4 hậu chỉ có
2 lời giải thể hiện trên cây bằng các đường đi màu xanh lục.
Nhóm 3

Trang 18/32



ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

3.4. Xây dựng chương trình.
3.4.1.

Khởi tạo

for( i=1;i<=n;i++)
Test_Col[i]=0; //khoi tao cho cot i con trong
for(j=2;j<=2*n;j++)
Test_Up[j]=0; //khoi tao cho duong cheo tren con trong
for (k=1;k<=2*n-1;k++)
Test_Down[k]=0; //khoi tao cho duong cheo duoi con trong
for (i=1;i<=n;i++)
Hau[i]=0;
for (i=0;iS[i]=0; // trang thai cho ban co, neu S[i]=0 thi tu hang i->tro ve
truoc ban co chua thay doi

3.4.2.

Code hàm main
row=1;


while(row>0)
{
// Neu S[row-1]=0, Vi tri cua quan co cua hang row-1 chua thay doi
if(S[row-1]==0)
{
for(col=Hau[row]+1;col<=n;col++)
{
if(int ok=Test(row,col)==0)
{
Nhóm 3

Trang 19/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

Insert(row,col);
S[row]=1;
break;
}
}
}
else
{
for(col=1;col<=n;col++)
{

if(int ok=Test(row,col)==0)
{
Insert(row,col);
S[row]=1;
S[row-1]=0;
break;
}
}
}
if(row!=n&&col<=n) row++;
else {
if(row==n&&col<=n)
{
count++;
Nhóm 3

Trang 20/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

printf("\n

| %3d.",count);

for (i=1;i<=n;i++)

printf("%3d",Hau[i]);
Remote(row,Hau[row]);//lay lai o cua quan hau hang cuoi
cung
}
row--;
Remote(row,Hau[row]);
}
}
printf("\n | So cach xep la %d",count);

3.4.3.

Hàm chèn “Hậu” vào hang và cột

void Insert(int r, int c)
{
Hau[r]=c;
Test_Col[c]=1;
Test_Up[c+r]=1;
Test_Down[r-c+n]=1;
}

Nhóm 3

Trang 21/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG


Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

3.4.4.

Hàm kiểm tra “Hậu” ở hàng và cột

/*ham kiem tra o hang r, cot c co chap nhan hay khong*/
/* ham tra ve 0 neu chap nhan va tra ve 1 neu nguoc lai*/
int Test(int r,int c)
{
int ok;
if(Test_Col[c]==0&&Test_Up[c+r]==0&&Test_Down[rc+n]==0)
return ok=0;
else return ok=1;
}

3.4.5.

Hàm lấy lại “Hậu” ở hang và cột

void Remote(int r, int c)
{
Test_Col[c]=0;
Test_Up[c+r]=0;
Test_Down[r-c+n]=0;
}

Nhóm 3


Trang 22/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

3.5. Kết Quả chương trình.
Hiển thị khi chạy:

Kết quả các cách sắp xếp 6 “Hậu”

Nhóm 3

Trang 23/32


ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

Kết quả các cách sắp xếp 7 “Hậu”

Nhóm 3

Trang 24/32



ĐỒ ÁN CẤU TRÚC DỮ LIỆU

GVHD: Th.S PHAN CHÍ TÙNG

Đề tài 8: Sắp xếp hậu trên bàn cờ vua sao cho chúng quản lý tất cả các vị trí trên bàn cờ

Chương trình Mô phỏng bằng VB:

Nhóm 3

Trang 25/32


×