藍橋杯 分考場(回溯 dfs)

2021-09-20 21:32:27 字數 1421 閱讀 9082

問題描述

n個人參加某項特殊考試。

為了公平,要求任何兩個認識的人不能分在同乙個考場。

求是少需要分幾個考場才能滿足條件。

輸入格式

第一行,乙個整數n(1輸出格式

一行乙個整數,表示最少分幾個考場。

樣例輸入58

1 21 3

1 42 3

2 42 5

3 44 5

樣例輸出

樣例輸入510

1 21 3

1 41 5

2 32 4

2 53 4

3 54 5

樣例輸出

dfs版本   (自己敲的就超時,題解的**就剛好過了)

#include#include#define min(a,b) a>b?b:a 

#define n 301

int vis[n][n];//關係表

int p[n][n];// 房間狀態

int ans=n,n,m;

void dfs(int x,int num)//如果已經安排了n個人,進行判斷

int j,k;

for(j=1;j<=num;j++)

} //回溯

p[j][0]=x;

dfs(x+1,num+1);// 如果所有房間都不滿足條件 增加房間

p[j][0]=0;//回溯

}int main()

dfs(1,1);

printf("%d\n",ans);

return 0;

}

回溯版本:

#include#include#include#include#include#include#include#include#includeusing namespace std;

int vis[105][105];//聯絡

int room[105][105];

int cnt[105];//教室裡學生是數量

int ans=1e9;

int n,m;

void sovle(int id,int num)

for(int i=1;i<=num;i++)

if(res==tmp)

}

//得新開乙個房間了

cnt[num+1]++;

room[num+1][cnt[num+1]]=id;

sovle(id+1,num+1);

cnt[num+1]--;}

int main()

sovle(1,0);

printf("%d\n",ans);

return 0;

}

藍橋杯 歷屆試題 分考場 (dfs回溯)

題目連線 題意 很明顯了。思路 暴力搜尋 剪支 每新加進來乙個人,都與已經開設的教室裡面的人進行對比,如果找到乙個教室滿足,教室裡面所有的人都不和新加入的人認識,那麼就考慮將這個人加進來。再回溯。最後,當所有教室都不滿足的時候,新增教室。反思 dfs回溯有待提高 include using name...

藍橋杯 分考場(回溯)

問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1輸出格式 一行乙個整數,表示最少分幾個考場。樣例輸入58 1 21 3 1 42 3 2 42 5 3 44 5 樣例輸出 樣例輸入510 1 21 ...

藍橋杯 分考場(dfs)

dfs求解 思路每次判斷輸入的人是否可以和前面的組隊 問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1 ans return if p n 1 for int i 1 i kans i 判斷完前面已...