Virtual_World_1
Description:
This is a virtual world, none of us can tell whether it is real or not. But I need you now~
Now, you are require to build this world, first you should make ‘person’ and ‘group’.
In the world, we can make group to invite persons or remove somone, make friends with others or break up with someone.
The rules of the world is inside the ‘main.cpp’, and the structure of ‘world.h’ is at the bottom of ‘main.cpp’
Some notes:
for ‘person’, when build a person, an ID would be arrange to him;
- the ID is from 0 - 9900, the first should be 0 and the next will be 1…;
for ‘group’, when build a group, an integer (0 or 1) is needed for initialization;
‘0’ means persons inside the group is strange to each other defaultly;
‘1’ means persons inside the group is already knowned to each other defaultly;
for ‘displayGroup()’, format is as the following:
Person_ID: ID sequence of the person’s friends (early-make friend should be print first!)
example => Person_0: 0, 2
Answer:
#include <iostream>
using namespace std;
#define MAX_FRIEND 99
#define MAX_COUNT 100
static int total_person = 0;
struct person {
int id, friend_count, friends[MAX_FRIEND];
person() {
id = total_person++;
friend_count = 0;
}
bool addFriend(int _id) {
for (int i = 0; i < friend_count; i++)
if (friends[i] == _id) return false;
friends[friend_count++] = _id;
return true;
}
bool deleteFriend(int _id) {
for (int i = 0; i < friend_count; i++)
if (friends[i] == _id) {
friend_count--;
for (int j = i; j < friend_count; j++)
friends[j] = friends[j+1];
return true;
}
return false;
}
};
// type_0: everybody is strange to each other at first
// type_1: everybody is known to each other at first
class group {
int person_count, type;
person member[MAX_COUNT];
public:
explicit group(int _type) {
type = _type;
person_count = 0;
}
~group() {}
void displayGroup() {
for (int i = 0; i < person_count; i++) {
cout << "Person_" << member[i].id << ": ";
for (int j = 0; j < member[i].friend_count-1; j++)
cout << member[i].friends[j] << ", ";
if (member[i].friend_count)
cout << member[i].friends[member[i].friend_count-1] << "\n";
else cout << "null\n";
}
}
bool addMember(const person &p) {
for (int i = 0; i < person_count; i++)
if (member[i].id == p.id) return false;
member[person_count++] = p;
for (int i = 0; type && i < person_count-1; i++)
makeFriend(member[i], member[person_count-1]);
return true;
}
bool deleteMember(const person &p) {
for (int i = 0; i < person_count; i++)
if (member[i].id == p.id) {
person_count--;
for (int j = i; j < person_count; j++)
member[j] = member[j+1];
return true;
}
return false;
}
bool makeFriend(const person &p1, const person &p2) {
int a = -1, b = -1;
for (int i = 0; i < person_count; i++)
if (member[i].id == p1.id) a = i;
else if (member[i].id == p2.id) b = i;
if (a == -1 || b == -1) return false;
else return member[a].addFriend(member[b].id) &&
member[b].addFriend(member[a].id);
}
bool breakRelation(const person &p1, const person &p2) {
int a = -1, b = -1;
for (int i = 0; i < person_count; i++)
if (member[i].id == p1.id) a = i;
else if (member[i].id == p2.id) b = i;
if (a == -1 || b == -1) return false;
else return member[a].deleteFriend(member[b].id) &&
member[b].deleteFriend(member[a].id);
}
};
void test_1() {
person mike, jack, lily, carson, sucie;
group school(0), family_1(1), family_2(1);
// make group (act as a society)
school.addMember(mike);
school.addMember(jack);
school.addMember(lily);
family_1.addMember(mike);
family_1.addMember(carson);
family_2.addMember(jack);
family_2.addMember(lily);
family_2.addMember(sucie);
// construct relationship in the society
school.makeFriend(mike, jack);
school.makeFriend(mike, lily);
// display the society
cout << "\n------ SCHOOL -----\n";
school.displayGroup();
cout << "\n------ FAMILY_1 -----\n";
family_1.displayGroup();
cout << "\n------ FAMILY_2 -----\n";
family_2.displayGroup();
}
void test_2() {
person Baidu, Alibaba, Tencent, NTES, Kingsoft_Antivirus, _360safe;
group BAT(1), ECommerce(1), Security(1);
// make group (act as a society)
BAT.addMember(Baidu);
BAT.addMember(Alibaba);
BAT.addMember(Tencent);
ECommerce.addMember(Baidu);
ECommerce.addMember(Alibaba);
ECommerce.addMember(Tencent);
ECommerce.addMember(NTES);
Security.addMember(Kingsoft_Antivirus);
Security.addMember(_360safe);
// display the society
cout << "\n------ BAT -----\n";
BAT.displayGroup();
cout << "\n------ ECommerce -----\n";
ECommerce.displayGroup();
cout << "\n------ Security -----\n";
Security.displayGroup();
}
void test_3() {
person p0, p1, p2, p3, p4;
group g0(0), g1(0), g2(1);
// make group (act as a society)
g0.addMember(p0);
g0.addMember(p1);
g0.addMember(p2);
g1.addMember(p0);
g1.addMember(p3);
g2.addMember(p3);
g2.addMember(p4);
// construct relationship in the society
g1.makeFriend(p0, p3);
g2.breakRelation(p3, p4);
g0.deleteMember(p2);
// display the society
cout << "\n------ G0 -----\n";
g0.displayGroup();
cout << "\n------ G1 -----\n";
g1.displayGroup();
cout << "\n------ G2 -----\n";
g2.displayGroup();
}
void test_4() {
person p[50];
group g0(0), g1(1);
int p_count;
cin >> p_count;
// make group (act as a society)
for (int i = 0; i < p_count/2; i++)
g0.addMember(p[i]);
for (int i = p_count/2; i < p_count; i++)
g1.addMember(p[i]);
// construct relationship in the society
for (int i = 0; i < p_count/5; i += 2)
g0.makeFriend(p[i], p[i+1]);
for (int i = p_count/2; i < p_count*3/4-1; i += 2)
g1.breakRelation(p[i], p[i+1]);
for (int i = p_count/4; i < p_count/2; i++)
g0.deleteMember(p[i]);
for (int i = p_count*3/4; i < p_count; i++)
g1.deleteMember(p[i]);
// display the society
cout << "\n------ G0 -----\n";
g0.displayGroup();
cout << "\n------ G1 -----\n";
g1.displayGroup();
}
int main() {
int test_id;
cin >> test_id;
switch (test_id) {
case 1:
test_1();
break;
case 2:
test_2();
break;
case 3:
test_3();
break;
case 4:
test_4();
break;
default:
cout << "wrong input\n";
}
return 0;
}
My Answer:
//
// World.h
// World
//
// Created by 颜泽鑫 on 4/22/16.
// Copyright © 2016 颜泽鑫. All rights reserved.
//
#ifndef World_h
#define World_h
#include <iostream>
#include <vector>
using namespace std;
struct person {
static int num;
int ID;
vector<int> friends;
person() {
ID = num++;
}
int get_ID() {
return ID;
}
bool addFriends(person newFriend) {
for (int i = 0; i != friends.size(); i++) {
if (friends[i] == newFriend.get_ID()) {
return false;
}
}
friends.push_back(newFriend.get_ID());
return true;
}
bool break_Friends(person NoFriend) {
vector<int>::iterator iter = friends.begin();
while (iter != friends.end()) {
if (*iter == NoFriend.get_ID()) {
friends.erase(iter);
return true;
}
iter++;
}
return false;
}
};
int person::num = 0;
class group {
private
:
int Known;
vector<person> member;
public
:
explicit group(int i = 0) : Known(i) {
}
void displayGroup() {
for (int i = 0; i != member.size(); i++) {
cout << "Person_" << member[i].get_ID() << ": ";
if (member[i].friends.begin() == member[i].friends.end()) {
cout << "null" << endl;
}
for (vector<int>::iterator iter = member[i].friends.begin();
iter != member[i].friends.end(); iter++) {
if (iter + 1 == member[i].friends.end()) {
cout << *iter << endl;
break;
}
cout << *iter << ", ";
}
}
}
bool addMember(person p) {
for (int i = 0; i != member.size(); i++) {
if (member[i].get_ID() == p.get_ID()) {
return false;
}
}
member.push_back(p);
for (int i = 0; Known && i != member.size() - 1; i++) {
makeFriend(member[i], member[member.size() - 1]);
}
return true;
}
bool deleteMember(person p) {
for (vector<person>::iterator iter = member.begin();
iter != member.end(); iter++) {
if (iter->get_ID() == p.get_ID()) {
member.erase(iter);
return true;
}
}
return false;
}
bool makeFriend(person p1, person p2) {
for (int i = 0; i != member.size(); i++) {
if (member[i].get_ID() == p1.get_ID()) {
member[i].addFriends(p2);
}
if (member[i].get_ID() == p2.get_ID()) {
member[i].addFriends(p1);
}
}
return true;
}
bool breakRelation(person p1, person p2) {
int p1_loc = 0;
int p2_loc = 0;
for (int i = 0; i != member.size(); i++) {
if (member[i].get_ID() == p1.get_ID()) {
p1_loc = i;
}
if (member[i].get_ID() == p2.get_ID()) {
p2_loc = i;
}
}
member[p1_loc].break_Friends(p2);
member[p2_loc].break_Friends(p1);
return true;
}
};
#endif /* World_h */
反思&总结:
此题难度在于==建立模型==!也就是根据题目要求完成对类的构建。最开始我尝试着使用==vector< person> friends==,但最后发现,这是不必要的。因为push_back会产生大量的开销,而且本质上,我们只需要获得person的id就足够了。所以直接做一个vector< int>即可。另外,对于==type==,我研究了很久,最后浑水摸鱼完成了,但答案给出了更好的方法,就是在没增加一个member的时候,都让其他的成员和新增的member之间建立联系,这种方法代码量很少,而且效率并不低,值得学习。此外,还是同样的问题,对于C++这种面向对象的编程,一定要学会调用已经写好的函数,就像此题的make friend之类的函数,这是非常重要的一种思想。最后,在代码完成之后,最好进行代码重构,这样代码看起来会更加的简洁。