清华大学C++课件10.ppt
文本预览下载声明
0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 2 3 4 A B C D E A B C D E 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 2 3 4 A B C D E A B C D E C E 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 2 3 4 A B C D E A B D C E B B …… int like[5][5] = { {0,0,1,1,0}, {1,1,0,0,1}, {0,1,1,0,1}, {0,0,0,1,0}, {0,1,0,0,1} }; int take[5], n; struct assign { int book[5]; }; //声明一个结构体类型assign int main() { n=0; assign a; //定义一个结构体类型的变量a for (int i=0; i5; i++) a.book[i] = 0; Try(0, a); return 0; } 分书问题的另一种解法: void assigning(int i, int j, assign a) { take[i]=j; if (i==4) { n++; cout 第n 方案\n; for (int k=0; k=4; k++) cout take[k] 号书分给 char(A+k) endl; cout endl; } else { a.book[j] = 1; Try(i+1, a); } } void Try(int i, assign a) { for (int j=0; j=4; j++) if ((like[i][j]0) (a.book[j]==0)) assigning(i, j, a); } 例6.4.6:8皇后问题 在8×8的棋盘上,放置8个皇后(棋子),使两两之间互不攻击。 所谓互不攻击是指任何两个皇后都要满足: 不在棋盘的同一行; 不在棋盘的同一列; 不在棋盘的同一对角线上。 可以推论出,每行有且仅有一个皇后。于是,这8个皇后每个应该 放在哪一列上是解该题的任务。 方法:“向前走,碰壁回头” —— “回溯法” 1 2 3 4 1 2 3 4 1 Q 1 Q 2 Q 2 Q 3 3 Q 4 4 1 2 3 4 1 2 3 4 1 Q 1 Q 2 Q 2 Q 3 Q 3 Q 4 Q 4 Q 可先尝试解“四皇后问题”,再解“八皇后问题”。 讨论:定义 q( i ) = j 表示第 i 行上的皇后放在第 j
显示全部