代码片段(1)[全屏查看所有代码]
1. [代码]求 N 皇后问题回溯算法 跳至 [1] [全屏预览]
01 | /* |
02 | * File: queen.c |
03 | * Description: 求 N 皇后问题回溯算法 |
04 | * Created: 2001/11/12 |
05 | * Author: Justin Hou [mailto:justin_hou@hotmail.com] |
06 | */ |
07 | #include <stdio.h> |
08 |
09 | #define DelayTime 20000 /* 显示棋局时间 */ |
10 | #define TopX 10 /* 棋盘左上角 x 坐标 */ |
11 | #define TopY 5 /* 棋盘左上角 y 坐标 */ |
12 |
13 | int N; /* 皇后数量 */ |
14 |
15 | int a[8], b[15], c[15]; |
16 | /* |
17 | * a[col-1] 记录第 col 列有无皇后, 1 表示有。 |
18 | * b[row+col-2] 记录从左上数第 row+col-1 条斜率为 1 的线上有无皇后。 |
19 | * c[row-col+7] 记录从右上数第 row-col+8 条斜率为 -1 的线上有无皇后。 |
20 | */ |
21 | int Num = 0; |
22 | int row; |
23 | void BackTrack ( int row) |
24 | { |
25 | int col; /* 局部变量 */ |
26 | for (col=1; col<=N; col++) |
27 | { |
28 | if (a[col-1] + b[row+col-2] + c[row-col+N-1] == 0) |
29 | { |
30 | a[col-1] = 1; /* 更改数据 */ |
31 | b[row+col-2] = 1; |
32 | c[row-col+N-1] = 1; |
33 |
34 | gotoxy(col*2 + TopX, row + TopY); /* 画皇后 */ |
35 | putch( 'Q' ); |
36 |
37 | if (row < N) |
38 | { |
39 | BackTrack (row + 1); |
40 | } |
41 | else |
42 | { |
43 | Num++; /* 递归终点 */ |
44 | gotoxy(40, 9); |
45 | printf ( "Num: %d " , Num); |
46 | delay(DelayTime); |
47 | } |
48 |
49 | a[col-1] = 0; /* 清空数据 */ |
50 | b[row+col-2] = 0; |
51 | c[row-col+N-1] = 0; |
52 |
53 | gotoxy(col*2 + TopX, row + TopY); /* 清除图象 */ |
54 | putch( '.' ); |
55 |
56 | } /* end if */ |
57 | } /* end for */ |
58 | } /* end function BackTrack */ |
59 |
60 | void main() |
61 | { |
62 | int i, j; |
63 | clrscr(); |
64 |
65 | gotoxy(1, 10); /* 要求用户输入皇后数量 */ |
66 | printf ( "Input the number of queen: " ); |
67 | while (N <= 0 || N > 14) |
68 | { |
69 | scanf ( "%d" , &N); |
70 | if (N > 14) printf ( "Two huge number, input again:" ); |
71 | if (N <= 0) printf ( "Can's smaller than 1, again:" ); |
72 | } |
73 |
74 | clrscr(); |
75 |
76 | for (i=1; i<=N; i++) /* 画棋盘(Chessboard) */ |
77 | { |
78 | for (j=1; j<=N; j++) |
79 | { |
80 | gotoxy(i*2 + TopX, j + TopY); |
81 | putch( '.' ); |
82 | } |
83 | } |
84 |
85 | BackTrack(1); /* 开始回溯算法 */ |
86 |
87 | gotoxy(12, 17); /* 显示最后结果 */ |
88 | printf ( "There are %d kinds of solution.\n" , Num); |
89 |
90 | getch(); |
91 | } |