There are Only 3 ways to do a task
the right way
the wrong way
and my way
mine is so wrong but it is the fastest :D
I'm sure someone can always complete my code so it will look friendlier. I had enough pain for today
Solution C++ Qt
network.h
#ifndef NETWORK_H
#define NETWORK_H
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
class Network{
vector<int> data;
public:
Network(){}
void affiche();
void add(int x);
void filter(int x);
~Network();
};
#endif // NETWORK_H
person.h
#ifndef PERSON_H
#define PERSON_H
#include <vector>
#include <iostream>
#include "network.h"
using namespace std;
class Person{
int ID;
vector<Person *> friends;
vector<Person *>::iterator i;
vector<Person *> link;
vector<int> data;
bool exist(Person * p);
static Network *n;
static int max_data_size;
void setdata();
bool allfriends();
int getid();
bool isfriend(Person * P);
public:
Person(int id);
void addfriend(Person * p);
static int getdatasize();
void arefriends();
void affiche();
Network* getNetwork();
~Person();
};
#endif // PERSON_H
network.cpp
#include "network.h"
void Network::affiche(){
for(int i=0;i<data.size();i++){
if(data.at(i)!=-1)
cout<<data.at(i)<<" ";
}
}
void Network::add(int x){
data.push_back(x);
}
void Network::filter(int x){
int f = pow(10,(double)x);
for(int i=0;i<data.size()-1;i++)
for(int j=i+1;j<data.size();j++){
if(data.at(i)<f){
data.at(i)=-1;
continue;
}
if(data.at(j)<f){
data.at(j)=-1;
continue;
}
if(data.at(i)==data.at(j))
data.at(j)=-1;
}
}
Network::~Network(){
data.clear();
}
person.cpp
#include "person.h"
Person::Person(int id){
if(id>=-1)
ID=id;
}
Network* Person::n=new Network;
int Person::max_data_size=0;
int Person::getdatasize(){
return max_data_size;
}
bool Person::exist(Person *p){
for(i=friends.begin();i!=friends.end();i++)
if((*i)->getid()==p->getid())
return true;
return false;
}
int Person::getid(){return ID;}
void Person::addfriend(Person *p){
if(!this->exist(p) && p->getid()!=this->ID){
friends.push_back(p);
p->addfriend(this);
}
}
bool Person::isfriend(Person *p){
for(i=friends.begin();i!=friends.end();i++)
if((*i)->getid()==p->getid())
return true;
return false;
}
void Person::affiche(){
cout<<endl<<endl<<this->ID;
for(i=friends.begin();i!=friends.end();i++)
cout<<"-"<<(*i)->getid();
cout<<endl;
}
void Person::setdata(){
if(this->max_data_size<link.size())
this->max_data_size=link.size();
for(int i=0;i<link.size();i++)
data.push_back(link.at(i)->getid());
int temp;
for(int i=0;i<data.size()-1;i++)
for(int j=i+1;j<data.size();j++){
if(data.at(i)<data.at(j)){
temp=data.at(j);
data.at(j)=data.at(i);
data.at(i)=temp;
}
}
int s=0;
for(int i=data.size()-1, j=0;i>=0;i--,j++)
s+= data.at(j)*pow(10,i);
n->add(s);
data.clear();
}
void Person::arefriends(){
for(unsigned int i=0;i<friends.size();i++){
link.push_back(this);
link.push_back(friends.at(i));
for(unsigned int j=0;j<friends.size();j++){
if(i==j)
continue;
if(friends.at(i)->isfriend(friends.at(j)))
link.push_back(friends.at(j));
else
continue;
}
if(allfriends())
setdata();
link.clear();
}
}
bool Person::allfriends(){
for(int i=0;i<link.size()-1;i++)
for(int j=i+1;j<link.size();j++)
if(!link.at(i)->isfriend(link.at(j)))
return false;
return true;
}
Network* Person::getNetwork(){
return n;
}
Person::~Person(){
delete n;
for(int i=0;i<friends.size();i++)
delete friends.at(i);
friends.clear();
for(int i=0;i<link.size();i++)
delete link.at(i);
link.clear();
}
main.cpp
#include "person.h"
#include "network.h"
#include <iostream>
using namespace std;
int main(){
Network * n;
Person * p = new Person(-1); //to get static data
Person * p0=new Person(0);
Person * p1=new Person(1);
Person * p2=new Person(2);
Person * p3=new Person(3);
p0->addfriend(p1);
p1->addfriend(p2);
p0->addfriend(p2);
p2->addfriend(p3);
p0->arefriends();
p1->arefriends();
p2->arefriends();
p3->arefriends();
n=p->getNetwork();
n->filter(p->getdatasize()-1);
n->affiche();
int x;
cin>>x;
return 0;
}
all you have to do is to create a Person with an ID
add some friends
RUN arefriends() for all your created Persons
that's it!!