PDA

View Full Version : کشیش و آدمخوار dfs



farbehar1
جمعه 02 بهمن 1394, 07:51 صبح
با سلام، مسئله ی کشیش و آدمخوار رو نوشتم اما به مشکل خوردم و بعد از ران شدن ارور close program میده اگه امکان داره منو راهنمایی کنید با سپاس
#include <iostream>

using namespace std;


class node {
public:
node *c1,*c2,*c3,*c4,*c5;
int cannibal,missionari;
int flag;
node()
{
}
};


class tree{
public:
node *root;
void add_root(node *n);
void add_c1(node *n,node *f);
void add_c2(node *n,node *f);
void add_c3(node *n,node *f);
void add_c4(node *n,node *f);
void add_c5(node *n,node *f);
void create_tree(node *n);
};
tree m;
void tree::add_root(node* n)
{
n->flag=1;
root=n;
}


void tree::add_c1(node *n,node *f)
{
n->flag=-1*f->flag;
if(f->flag==1)
{
n->cannibal=f->cannibal;
n->missionari=f->missionari-2;
}
else
{
n->cannibal=f->cannibal;
n->missionari=f->missionari+2;
}
if( (n->cannibal<=0 || n->missionari<=0) || (n->cannibal>3 || n->missionari>3) || (n->cannibal==f->cannibal && n->missionari==f->missionari+2) )
f->c1=0;
else
f->c1=n;
}


void tree::add_c2(node *n,node *f)
{
n->flag=-1*f->flag;
if(f->flag)
{
n->cannibal=f->cannibal-2;
n->missionari=f->missionari;
}
else
{
n->cannibal=f->cannibal+2;
n->missionari=f->missionari;
}
if((n->cannibal<=0 || n->missionari<=0) || (n->cannibal>3 || n->missionari>3) || (n->cannibal==f->cannibal+2 && n->missionari==f->missionari))
f->c2=0;
else
f->c2=n;
}


void tree::add_c3(node *n,node *f)
{
n->flag=-1*f->flag;
if(f->flag==1)
{
n->cannibal=f->cannibal-1;
n->missionari=f->missionari;
}
else
{
n->cannibal=f->cannibal+1;
n->missionari=f->missionari;
}
if( (n->cannibal<=0 || n->missionari<=0) || (n->cannibal>3 || n->missionari>3) || (n->cannibal==f->cannibal+1 && n->missionari==f->missionari) )
f->c3=0;
else
f->c3=n;
}


void tree::add_c4(node *n,node *f)
{
n->flag=-1*f->flag;
if(f->flag==1)
{
n->cannibal=f->cannibal;
n->missionari=f->missionari-1;
}
else
{
n->cannibal=f->cannibal;
n->missionari=f->missionari+1;
}
if( (n->cannibal<=0 || n->missionari<=0) || (n->cannibal>3 || n->missionari>3) || (n->cannibal==f->cannibal && n->missionari==f->missionari+1) )
f->c4=0;
else
f->c4=n;
}


void tree::add_c5(node *n,node *f)
{
n->flag=-1*f->flag;
if(f->flag==1)
{
n->cannibal=f->cannibal-1;
n->missionari=f->missionari-1;
}
else
{
n->cannibal=f->cannibal+1;
n->missionari=f->missionari+1;
}
if( (n->cannibal<=0 || n->missionari<=0) || (n->cannibal>3 || n->missionari>3) || (n->cannibal==f->cannibal+1 && n->missionari==f->missionari+1) )
f->c5=0;
else
f->c5=n;
}
void tree::create_tree(node *n)
{
if (n!=0)
{
node *a=new node;
node *b=new node;
node *c=new node;
node *d=new node;
node *e=new node;
add_c1(a,n);
add_c2(b,n);
add_c3(c,n);
add_c4(d,n);
add_c5(e,n);
create_tree(a);
create_tree(b);
create_tree(c);
create_tree(d);
create_tree(e);
}
}


void dfs(node *n)
{
if (n!=0)
{
dfs(n->c1);
dfs(n->c2);
dfs(n->c3);
dfs(n->c4);
dfs(n->c5);
cout<<n->missionari<<"\n"<<n->cannibal;


}
}


int main()
{
node *o=new node;
o->missionari=3;
o->cannibal=3;
m.add_root(o);
m.create_tree(o);
dfs(o);
return 0;
}