题意描述:给定K支队伍,每队三个队员,不同队伍之间队员可能部分重复,输出这些队员同时能够组成多少完整的队伍;
DFS,利用DFS深度优先搜索,如果该队所有队员都没有被访问过,那么将该队计入结果,再去选择下一队~
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <map> 7 using namespace std; 8 9 struct team{ 10 int a,b,c; 11 }; 12 13 team dif[20]; 14 int n,result; 15 int visit[60]; 16 map<string,int>q; 17 18 void dfs(int x,int y){ 19 result = max(result,x); 20 if(y>n) 21 return ; 22 23 //如果 dif[y]队的成员都没被访问过 ,那么就可以计入结果,result++; 24 //否则就 继续搜索下一队。 25 if(!visit[dif[y].a]&&!visit[dif[y].b]&&!visit[dif[y].c]){ 26 visit[dif[y].a] = visit[dif[y].b] = visit[dif[y].c]=1; 27 dfs(x+1,y+1); 28 visit[dif[y].a] = visit[dif[y].b] = visit[dif[y].c]=0; 29 } 30 else{ 31 dfs(x,y+1); 32 } 33 } 34 35 int main(){ 36 int temp=0; 37 string str1,str2,str3; 38 cin>>n; 39 for(int i=1;i<=n;i++){ 40 cin>>str1>>str2>>str3; //利用 map 直接将重复元素滤去 41 42 if(!q[str1]){ //选择不重复的 string,匹配 int后, 作为q的新元素 43 temp++; 44 q[str1] = temp; 45 } 46 if(!q[str2]){ 47 temp++; 48 q[str2] = temp; 49 } 50 if(!q[str3]){ 51 temp++; 52 q[str3] = temp; 53 } 54 dif[i].a = q[str1]; 55 dif[i].b = q[str2]; 56 dif[i].c = q[str3]; 57 } 58 //如此就将人名映射成不同的数字 ,然后在 visit[]中计入是否已经访问过。 59 60 for(int i=1;i<= n;i++){ 61 visit[dif[i].a] = visit[dif[i].b] = visit[dif[i].c] = 1; 62 dfs(1,i+1); 63 visit[dif[i].a] = visit[dif[i].b] = visit[dif[i].c] = 0; 64 } 65 cout<<result<<endl; 66 return 0; 67 }