百度面试题 关于分组游戏的设计

来源:互联网 发布:软件测试校园招聘 编辑:程序博客网 时间:2024/06/06 00:58

百度全体员工玩分组游戏,前面五分钟大家分头找队友,并将每个人找到的队友信息汇报给主持人,如果A和B是队友,B和C是队友,那么A和C也是队友;接着主持人不断地随机抽取两个人,希望判断二者是否为队友。请设计一个计算机程序辅助主持人判断两个人是否为队友,说明程序的关键算法,不需要代码实现。
struct Data{
int left;
int right;
};
class OnelinkNode
{
public:
 Data data;
 OnelinkNode *next;
 OnelinkNode(int left,int right,OnelinkNode *p=NULL)
 {
  data.left=left;
  data.right=right;
  next=p;
 }
 ~OnelinkNode()
 {}
};
#include <iostream.h>
#include "OnelinkNode.h"
class
Onering{
public:
 OnelinkNode *head;
 int length;
 void OneringUint(int left,int right);
 Onering();
 ~Onering();
  bool isEmpty()const//判断链表是否为空
 {
  return head==NULL;
 }
 bool remove(OnelinkNode *p);
 void output();
 void insert_at_head(OnelinkNode *p);
 void insert_at_end(OnelinkNode *p);
 bool findNode(int k);
 int OneringLength();
 OnelinkNode* remove_at_head();
 OnelinkNode* remove_at_end();
};
Onering::Onering(){
 length=0;
}
void Onering::OneringUint(int left,int right)
{
 head=NULL;
 OnelinkNode *rear;
 head=new OnelinkNode(left,right,head);
 rear=head;
 rear->next=head;
 length++;
}
Onering::~Onering()
{
 OnelinkNode *p=head,*q;
 do
 {
  q=p;
  p=p->next;
  delete q;
 }
 while(p!=head);
  head=NULL;
}
OnelinkNode* Onering::remove_at_head(){
 OnelinkNode *q,*temp;
 q=head;
 while(q->next!=head)
 q=q->next;
 temp=q;
 head=head->next;
 remove(q);
 return temp;
}
OnelinkNode* Onering::remove_at_end()
{
 OnelinkNode *q,*temp;
 q=head;
 while(q->next->next!=head)
 q=q->next;
 temp=q;
 remove(q);
 return temp;
}
bool Onering::remove(OnelinkNode *p)
{
 if(p!=NULL)
 
 {
  OnelinkNode *r;
     r=p->next;
 if(r!=NULL)
 {
  if(r==head)
   head=p->next;
   p->next=r->next;
   delete r;
   return true;
 }
 }
 return false;
}
void Onering::output()
{
    OnelinkNode *p=head;
 do{
      cout<<p->data.left<<p->data.right<<"-";
   p=p->next;
 }
 while(p!=head);
    cout<<endl;
}
void Onering::insert_at_end(OnelinkNode *p)
{
   OnelinkNode *q;
   q=head->next;
   while(q->next!=head)
    q=q->next;
      p->next=head;
   q->next=p;
   length++;
}
void Onering::insert_at_head(OnelinkNode *p)
{
   insert_at_end(p);
   OnelinkNode *temp;
   temp=head;
   while(head->next!=temp)
    head=head->next;
       length++;
}
bool Onering::findNode(int k)
{
 int temp=length;
 OnelinkNode *q=head;
 bool flag=false;
 while(temp)
 {
  if(q->data.left==k||q->data.right==k)
  {
      flag=true;
   break;
  }
   else
  q=q->next;
   temp--;
 }
 return flag;
}
#include <iostream.h>
#include <stdio.h>
#include "Onering.h"
#define MAXNUMBER 100
typedef Onering Ring[MAXNUMBER];
//假设百度里面的总人数为N,最坏的情况下,可以分为N/2组;

void main(){
bool exchange=false;
Ring ring;
int left,right;
cin>>left>>right;
ring[0].OneringUint(left,right);
int sum=1,a,b;
int N=10;
//所有的人数组队完毕
while(N--)
{
   cin>>a>>b;
   exchange=false;
   for(int j=0;j<sum;j++)
   {
    if(ring[j].findNode(a)||ring[j].findNode(b))
    {
        OnelinkNode *node=new OnelinkNode(a,b);
    ring[j].insert_at_end(node);
    exchange=true;
    //在所有连中均未找到插入点,则新建链
    break;
    }
   }
    if(!exchange)
    {
     sum++;
     ring[sum-1].OneringUint(a,b);  
    }
     
}
for (int i=0;i<sum;i++)
{
 ring[i].output();
}
cout<<"请输入待测的两个人的编号"<<endl;
int cheshi1,cheshi2,num;
cin>>cheshi1>>cheshi2;
   for (i=0;i<sum;i++)
   {
   if(ring[i].findNode(cheshi1))
   {
    num=i;
       break;
   }
   }
   if(ring[num].findNode(cheshi2))
   {
    cout<<"yes"<<endl;
   }
   else
    cout<<"no"<<endl;

}

原创粉丝点击