將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。
對於乙個規模為 n 的問題,若問題可以容易地解決,則直接解決,否則將其分解為 k 個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。
1、分解:將原問題分解為若干規模較小、相互獨立、與原問題形式相同的子問題;
2、解決:若子問題規模較小而容易被解決則直接解決,否則,遞迴地解各個子問題;
3、合併:將各子問題的解合併得到原問題的解。
1、棋盤覆蓋
在乙個 2k * 2k 個方格組成的棋盤中,有乙個方格與其它的不同,若使用以下四種 l 型骨牌覆蓋除這個特殊方格的其它方格,如何覆蓋。四個 l 型骨牌如下圖:
圖1.1 l型骨牌
棋盤中的特殊方格如圖:
圖1.2 存在特殊方格的棋盤
覆蓋完成後的棋盤:
圖1.3 覆蓋完成的棋盤
1 #include22、迴圈賽日程表using
namespace
std;34
int tile = 0;5
int board[4][4]; //
棋盤 67/*
8tr:棋盤左上角方格的行號
9tc:棋盤左上角方格的列號
10dr:特殊方格所在的行號
11dc:特殊方格所在的列號
12size:棋盤的規格(size * size)
13*/
14void chessboard(int tr,int tc , int dr, int dc, int
size)
1530
31//
覆蓋右上角子棋盤
32if(dr < tr+s && dc >= tc+s)
33//
特殊方格在此棋盤中
34 chessboard(tr,tc+s,dr,dc,s);
35else
36
4243
//覆蓋左下角子棋盤
44if(dr >= tr+s && dc < tc+s)
45//
特殊方格在此棋盤中
46 chessboard(tr+s,tc,dr,dc,s);
47else
48
5455
//覆蓋右下角子棋盤
56if(dr >= tr+s && dc >= tc+s)
57//
特殊方格在此棋盤中
58 chessboard(tr+s,tc+s,dr,dc,s);
59else
60
6667}68
69int
main()
7079 cout<
81return0;
82 }
設有 n = 2k 個運動員要進行網球迴圈賽。現要設計乙個滿足以下要求的比賽日程表:
(1)每個選手必須與其他n-1個選手各賽一次;
(2)每個選手一天只能參賽一次;
(3)迴圈賽在n-1天內結束。
請按此要求將比賽日程表設計成有 n 行和 n-1 列的乙個表。在表中的第 i 行,第 j 列處填入第 i 個選手在第 j 天所遇到的選手。其中 1 ≤ i ≤ n,1 ≤ j ≤ n-1。8 個選手的比賽日程表如下圖:
選手的個數67
/*8tox:目標陣列的行號
9toy:目標陣列的列號
10fromx:源陣列的行號
11fromy:源陣列的列號
12r:陣列的大小為 r*r
13*/
14void copy(int tox, int toy, int fromx, int fromy, int
r)15
2021
void table(int
k)2234}
3536
37int
main()
3851 cout<
52}
53return0;
54 }
分治法 迴圈賽日程表
設有n 2k個運動員要進行羽毛球迴圈賽,現要設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其它n 1個選手各賽一次 2 每個選手一天只能比賽一次 3 迴圈賽一共需要進行n 1天。由於n 2 k,顯然n為偶數。按分治策略,將所有的選手分為兩半,n個選手的比賽日程表就可以通過為n 2個選手設計的比...
迴圈賽日程表 分治法
設有n 2 k個運動員,要進行網球迴圈賽。現在要設計乙個滿足以下要求的比賽日程表,每個選手必須與其他n 1個選手各賽一場,每個選手一天只能賽一次,迴圈賽一共進行n 1天,將比賽日程表設計成n行n列,表中除了第一列,其他n 1列才是我們要的,陣列下標行列都從0開始,第i行j列代表第 i 1 位選手在第...
迴圈賽日程表(分治)
設有 n 2的k次方 個運動員要進行網球迴圈賽。現要設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其他n 1個選手各自賽一次。2 每個選手一天只能賽一次。3 迴圈賽一共進行n 1天。按分治策略,我們可以將所有的選手分為兩半,n個選手的比賽日程表可以通過n 2個選手設計的比賽日程表來決定。遞迴地...