問題描述
n個人參加某項特殊考試。
為了公平,要求任何兩個認識的人不能分在同乙個考場。
求是少需要分幾個考場才能滿足條件。
輸入格式
第一行,乙個整數n(1arabic1666
在解這道題之前,先要理解以下幾點:
滿足「任何兩個認識的人不能分在同乙個考場」這一要求的解不是唯一的,所以才需要求考場數最少的解,舉個例子:4個考生,認識關係為:1 4;2 3;3 4;那麼滿足條件的解有、,以及、、,那麼肯定第一種是考場數最少的解法。
回溯法:遞迴+剪枝,回溯法採用試錯的思想,它嘗試分步的去解決乙個問題。在分步解決問題的過程中,當它通過嘗試發現現有的分步答案不能得到有效的正確的解答的時候,它將取消上一步甚至是上幾步的計算,再通過其它的可能的分步解答再次嘗試尋找問題的答案。
剪枝:借用博主[arabic1666]的話來說就是,剪枝策略就是在搜尋過程中利用過濾條件來剪去完全不用考慮(已經判斷這條路走下去得不到最優解)的搜尋路徑,從而避免了一些不必要的搜尋,大大優化了演算法求解速度,還保證了結果的正確性。
應用到回溯演算法中,我們就可以提前判斷當前路徑是否能產生結果集,如果否,就可以提前回溯。而這也叫做可行性剪枝
可能注釋有點雜亂,請見諒
#include
#include
#define n 110
#define min(a,b) a>b?b:a
int relachart[n]
[n];
//relational chart
int roomchart[n]
[n];
//考場表
int n,rooms=n;
//考生人數 考場數
void
dfs(
int x,
int r)
;//分考場
intmain()
dfs(1,
1);//從第乙個人開始安排教室
printf
("%d"
,rooms)
;return0;
}void
dfs(
int x,
int r)
for(i=
1;i<=r;i++)}
roomchart[i][0
]=x;
//如果找完所有考場也沒有合適的座位,那麼就只有增加乙個考場了
dfs(x+
1,r+1)
; roomchart[i][0
]=0;
回溯!!將x的位置清零,並返回到上一層函式,重新給它安排考場
}
藍橋杯 歷屆試題 分考場 c語言
分考場 時間限制 1.0s 記憶體限制 256.0mb 問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1思路 圖的著色演算法 每對乙個點進行著色,該點可選擇已有的點進行著色,也可選擇著乙個新的顏色,...
藍橋杯 歷屆試題 分考場(C )
採用dfs。在已知的狀態下,然後判斷下乙個學生是否可以安排到之前存在的教室,如果不可以的話,那麼就新開乙個教室。參考藍橋杯 歷屆試題 分考場 dfs 藍橋杯 歷屆試題 分考場 dfs include.h using namespace std int n,min kes int p 102 102 ...
藍橋杯 歷屆試題 分考場
問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1輸出格式 一行乙個整數,表示最少分幾個考場。樣例輸入5 8 1 2 1 3 1 4 2 3 2 4 2 5 3 4 4 5樣例輸出 4樣例輸入5 10...