中国科学院软件研究所软件工程技术中心2007年硕士研究生复试上机题

原创 2007年10月06日 20:43:00
 今年考上中科院软件所了,便把复试时的上机题分享,算法共欣赏,代码相与析。

    题目是这样的:

现在在数据库中保存有这样一张表(电影名:string,演员个数:number,演员名:string),如果演员A和演员B参加了同一部电影1的演播,演员B和演员C参加了另一个电影2的演播,而演员C和演员D参加了电影3的演出,那么,我们认为演员A和演员D之间存在友情联接,并定义这种联接的长度为3。请用C/C++/Java给出算法,找出所有演员的联接长度恰好为3的友情演员。

例如,有6部电影,信息如下:

1.Mission Impossible 3》,演员3人,分别为:Tom CruiseMaggie QJeff Chase

2.War Of The Worlds》,演员2人,分别为:Tom CruiseDakota Fanning

3.Shark Tale》演员3人,分别为:Jack BlackRobert DeNiroWill Smith

4.Hide And Seek》,演员2人,分别为:Dakota FanningRobert DeNiro

5.The Adventure Of Pluto Nash》,演员2人,分别为:Will SmithEddie Murphy

6.Show Time》,演员2人,分别为:Robert DeNiroEddie Murphy

那么,请程序打印出这些演员的联接长度恰好为3的友情演员清单

 

我使用的算法是双向广度优先搜索,先把所有的演员放在集合中,然后用两个for循环遍历,判断任意两个演员之间是否存在长度为3的连接,若存在,就打印出来。代码如下(使用标准C++和STL):

 

#include <map>
#include <set>
#include <functional>
#include <algorithm>
#include <iterator>
#include <functional>
#include <string>
#include <fstream>
#include <iostream>

using namespace std;

class CProblem 
{
public:
    void Print();
    void Solve();
 void GetFilm(string Actor,set<string>& FilmSet);
 void GetLink1(string Actor,set<string>& ActorSet);
 bool IsLink3(string actor1,string actor2);
 CProblem(char* filename);
 virtual ~CProblem();
protected:
 multimap<string,string,less<string> >ActorFilmMap;
 set<string>ActorSet;
};

CProblem::CProblem(char* filename)
{
 ifstream fin(filename);
 if(!fin)
 {
  cerr<<"File not open!"<<endl;
  exit(1);
 }
 string ActorName,FilmName;
 int ActorNum;
 while(getline(fin,FilmName,'/n'))
 {
  fin>>ActorNum;
  getline(fin,ActorName,'/n');
  for(int i=0;i<ActorNum;i++)
  {
            getline(fin,ActorName,'/n');
   ActorFilmMap.insert(make_pair(ActorName,FilmName));
   ActorSet.insert(ActorName);
  }
        getline(fin,FilmName,'/n');
 }
 fin.close();
}

CProblem::~CProblem()
{

}

bool CProblem::IsLink3(string actor1, string actor2)
{
     set<string>ActorSet1,ActorSet2;
     GetLink1(actor1,ActorSet1);
     GetLink1(actor2,ActorSet2);
    
     set<string>::iterator Iter1,Iter2;
     for(Iter1=ActorSet1.begin();Iter1!=ActorSet1.end();Iter1++)
         for(Iter2=ActorSet2.begin();Iter2!=ActorSet2.end();Iter2++)
         {
             if(*Iter1!=*Iter2 && actor1!=*Iter2 && actor2!=*Iter1)
             {
                 set<string,less<string> >FilmSet1,FilmSet2;
                 GetFilm(*Iter1,FilmSet1);
                 GetFilm(*Iter2,FilmSet2);
                
                 set<string>::iterator Iter3,Iter4;
                 for(Iter3=FilmSet1.begin();Iter3!=FilmSet1.end();Iter3++)
                     for(Iter4=FilmSet2.begin();Iter4!=FilmSet2.end();Iter4++)
                         if(*Iter3==*Iter4)
                             return true;
             }
         }
 return false;
}

void CProblem::GetLink1(string Actor,set<string>& ActorSet)
{
     set<string>FilmSet;
     GetFilm(Actor,FilmSet);
    
     set<string>::iterator Iter1;
     multimap<string,string>::iterator Iter2;
     for(Iter1=FilmSet.begin();Iter1!=FilmSet.end();Iter1++)
     for(Iter2=ActorFilmMap.begin();Iter2!=ActorFilmMap.end();Iter2++)
     {
     if(*Iter1==Iter2->second && Actor!=Iter2->first)
     ActorSet.insert(Iter2->first);
     }
    
}

void CProblem::GetFilm(string Actor,set<string>& FilmSet)
{
     multimap<string,string>::iterator Iter1;
     for(Iter1=ActorFilmMap.lower_bound(Actor);Iter1!=ActorFilmMap.upper_bound(Actor);Iter1++)
     {
     FilmSet.insert(Iter1->second);
     }
}

void CProblem::Solve()
{
     set<string>::iterator Iter1,Iter2;
     for(Iter1=ActorSet.begin();Iter1!=ActorSet.end();Iter1++)
     {
         for(Iter2=ActorSet.begin();Iter2!=ActorSet.end();Iter2++)
         {
             if(*Iter2==*Iter1)
                 continue;
             if(IsLink3(*Iter1,*Iter2))
                 cout<<*Iter1<<" and "<<*Iter2<<" are of link 3."<<endl;
         }
         cout<<endl;
     }
}

void CProblem::Print()
{
     multimap<string,string>::iterator Iter1;
     for(Iter1=ActorFilmMap.begin();Iter1!=ActorFilmMap.end();Iter1++)
     cout<<Iter1->first<<" "<<Iter1->second<<endl;
}
int main()
{
    CProblem prob("data.txt");
   prob.Solve();
   
    system("PAUSE");
    return 0;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

data.txt:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

MissionImpossible3
3
TomCruise
MaggieQ
JeffChase

WarOfTheWorlds
2
TomCruise
DakotaFanning

SharkTale
3
JackBlack
RobertDeNiro
WillSmith

HideAndSeek
2
DakotaFanning
RobertDeNiro

TheAdventureOfPlutoNash
2
WillSmith
EddieMurphy

ShowTime
2
RobertDeNiro
EddieMurphy

2017年中山大学软件工程专硕考研经验

2017年中山大学软件工程专硕考研经验,包括初试、复试的复习经验,以及导师联系、心理等方面的重要指导。...
  • qq_14809723
  • qq_14809723
  • 2017年03月30日 23:59
  • 3744

我的保研经历——中国科学院计算技术研究所

忙碌了大半年的保研事情已经尘埃落定了,心理也踏实下来了,总想着把自己的这段保研经历记录下来,希望能对小伙伴们有所帮助。能来到郑大并且读软件工程这个专业并且阴差阳错的进了卓越班也算是老天注定吧(可以这样...
  • violet_echo_0908
  • violet_echo_0908
  • 2016年12月07日 17:17
  • 6270

中科院软件所、计算所保研复试回忆

六月的时候报名了软件所的夏令营,应该也是运气比较好,我一个师范类院校的孩子竟然有幸被选中去夏令营玩。 第一批的时候并没有被录取上,后来是老师打电话给我补录的。当时那一天刚考完大学最后一门专业必修课,...
  • wxyfennie
  • wxyfennie
  • 2016年10月03日 12:36
  • 4663

广州中国科学院软件应用技术研究所笔经

首当其冲,一个java的基础知识,掌握的不明确。String/StringBuffer/StringBuilder的区别 ######################################...
  • naughty610
  • naughty610
  • 2011年07月06日 19:26
  • 2138

软件工程硕士研究生论文撰写事项

本文转载于:http://blog.sina.com.cn/s/blog_6860203101017rss.html 年复一年指导硕士研究生撰写论文,特将软件工程方向的专业硕士(即工程硕士)...
  • sulinux
  • sulinux
  • 2014年12月21日 21:45
  • 1276

Mary Poppendieck:软件工程技术的未来

“云、架构即代码、具有API和反脆弱系统的联邦架构,这些软件系统开发技术正迅速成为关注焦点”。这是Mary Poppendieck在GOTO Berlin 2016大会上做“软件工程技术的未来”演讲时...
  • dica54dica
  • dica54dica
  • 2016年12月09日 09:09
  • 660

中国科学院软件研究所:博导研究方向及邮件地址 .

【计算机软件与理论(081202)】 部门   姓 名 研究方向 E-mail地址 计算机科学国家重点实验室  林惠民 并发理论与模型检测 lhm(at)ios.ac....
  • hulongcan1129
  • hulongcan1129
  • 2012年07月05日 11:24
  • 29127

2007年浙江大学计算机及软件工程研究生机试真题

http://ac.jobdu.com/problem.php?pid=1025  最大报销额 //将题目中数字都扩大100倍变成整数,就可看作经典的01背包问题 //设报销额度为背包上限,可报销支...
  • Hackbuteer1
  • Hackbuteer1
  • 2012年02月26日 20:53
  • 2410

题目1022:游船出租 2007年浙江大学计算机及软件工程研究生机试真题

题目描述:     现有公园游船租赁处请你编写一个租船管理系统。当游客租船时,管理员输入船号并按下S键,系统开始计时;当游客还船时,管理员输入船号并按下E键,系统结束计时。船号为不超过100的正整数...
  • ZJFCLH
  • ZJFCLH
  • 2014年03月09日 13:09
  • 1130

题目1023:EXCEL排序 2007年浙江大学计算机及软件工程研究生机试真题

题目描述:     Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。     对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 ...
  • ZJFCLH
  • ZJFCLH
  • 2014年03月09日 17:24
  • 857
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:中国科学院软件研究所软件工程技术中心2007年硕士研究生复试上机题
举报原因:
原因补充:

(最多只允许输入30个字)