欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

华为笔试

程序员文章站 2022-03-06 23:03:09
...

在通讯软件中,在群里面转发消息可以使得一条消息扩散到最多那里。假设已知有m个群,其中一个人把一条消息发到他所在的群里面,这些群里面的每个人又把消息再次转发到他所有的群里面,请问所有群的所有人都转发过一次后,最后几个人收到该消息(包括发消息的人)?输出收到消息的人数(以十进制整数输出,不需要加换行符)

输入描述:
发第一条消息的人名
群组个数m
群组1成员人名列表
群组2成员人名列表

群组m成员人名列表

人名是英文字符串,包含英文字母和空格,最大长度不超过100字符。

群组个数m是十进制整数,最大不超过100。

群组成员人名列表包含1至多个人名,两个人名之间以逗号分隔。

输出描述:
以十进制输出最后能受到消息的人数。

示例:

输入:

Jack
3
Jack,Tom,Anny,Lucy
Tom,Danny
Jack,Lily

输出:

6

思路:

先统计所有人名所在的组号,然后按照BFS去遍历;(注意只有Jack一个人一组,而没有包含在其他组的情况,这时候应该输出1)

#include <bits/stdc++.h> 
using namespace std;

vector<string> pro(string& str){
    vector<string> res;
    int index =0;
    for(int i=0;i<str.size(); i++){
        if(str[i]==','){
            res.push_back(str.substr(index, i-index) );
            index = i+1;
        }
    }
    if(index<str.size()){
        res.push_back(str.substr(index));
    }
    return res;
}

int main(){
    string name;	 //发送消息人的名字 
    while(cin>>name){
        int m;
        cin>>m;		//群组个数 
        string cur;
        vector<vector<string> > data;
        for(int i=0; i<m; i++){ 
            cin>>cur;
            data.push_back(  pro(cur ) );
        }			//得到分割后的群组二维字符串组 
        
        map<string, vector<int> > exist;
        
        for(int i=0;i<data.size(); i++){
            for(int j=0; j<data[i].size();j++ ){
                exist[ data[i][j] ].push_back(i) ;              
            } 
        }			//记录每个人名的组号 
        
        queue<int> temp;         
        for(int i=0; i<exist[name].size(); i++){
            temp.push( exist[name][i] );
        }			//当前人名所在的组号队列 
        
        
        vector<int> visited(m,0);
        set<string> res; 
        res.insert(name);    
        
        
        while(!temp.empty()){
            int cur = temp.front();
            temp.pop();
            visited[cur] = 1;
            for(int i=0; i<data[cur].size(); i++){
                for(int j=0; j< exist[ data[cur][i]  ].size(); j++ ){
                    if( !visited[ exist[  data[cur][i]  ][j] ]  )    {
                        temp.push( exist[ data[cur][i] ][j] );
                    }                     
                }                
                res.insert( data[cur][i] );
            }
        }         
        cout<<res.size();         
    }     
}
相关标签: 华为