payam11
سه شنبه 23 بهمن 1386, 17:38 عصر
سلام دوستان من یه برنامه برای مرتب کردن پازل 3*3 به روش حریصانه نوشتم.که اول اعداد 0 تا 8 رو از کاربر میگیره و بعد به روش حریصانه مرتبش میکنه ولی برای بعضی از حالات جواب نمیده.سورس برنامه رو میزارم اگه کسی کمکم کنه خیلی ممنون میشم.
#include<conio.h>
#include<iostream.h>
struct node
{
int a[3][3],z;
node *l,*r,*t,*d;
}*s,*v;
bool vv;
int b[3][3],c;
class tree
{
node *root;
public:
tree(){root=0;}
node* re(){return root;}
void getnode(node *p);
void pos(node *p)
{
if(p)
{
if(v->a[0][0]==p->a[0][0]&&v->a[0][1]==p->a[0][1]&&v->a[0][2]==p->a[0][2]
&&v->a[1][0]==p->a[1][0]&&v->a[1][1]==p->a[1][1]&&v->a[1][2]==p->a[1][2]
&&v->a[2][0]==p->a[2][0]&&v->a[2][1]==p->a[2][1]&&v->a[2][2]==p->a[2][2])
vv=1;
pos(p->l);
pos(p->d);
pos(p->t);
pos(p->r);
}
}
void he(node *p)
{
int i,j,k=1;
for(i=0;i<3;i++)
for(j=0;j<3;j++,k++)
if(p->a[i][j]!=k)
if(k!=9)
p->z++;
else
if(p->a[2][2]!=0)
p->z++;
}
void pre(node *p)
{
if(p)
{
if(!p->l&&!p->r&&!p->t&&!p->d)
{
if(p->z<c)
{
s=p;
c=s->z;
}
}
pre(p->l);
pre(p->d);
pre(p->t);
pre(p->r);
}
}
};
void tree::getnode(node *p)
{
bool kk=0;
int i,j,k,m,n;
node *q;
if(!root)
{
q=new node;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
q->a[i][j]=b[i][j];
q->z=0;
he(q);
if(q->z==0)
kk=1;
q->l=q->r=q->t=q->d=0;
p=q;
root=q;
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(p->a[i][j]==0)
{
m=i;
n=j;
}
if(kk==0)
{
if(m-1!=-1)
{
node *f;
f=new node;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
f->a[i][j]=p->a[i][j];
k=f->a[m-1][n];
f->a[m-1][n]=0;
f->a[m][n]=k;
v=f;
vv=0;
pos(re());
if(vv)
delete f;
else
{
kk=1;
f->l=f->r=f->t=f->d=0;
f->z=0;
he(f);
p->t=f;
}
}
if(n-1!=-1)
{
node *e;
e=new node;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
e->a[i][j]=p->a[i][j];
k=e->a[m][n-1];
e->a[m][n-1]=0;
e->a[m][n]=k;
v=e;
vv=0;
pos(re());
if(vv)
delete e;
else
{
kk=1;
e->l=e->r=e->t=e->d=0;
e->z=0;
he(e);
p->l=e;
}
}
if(m+1!=3)
{
node *u;
u=new node;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
u->a[i][j]=p->a[i][j];
k=u->a[m+1][n];
u->a[m+1][n]=0;
u->a[m][n]=k;
v=u;
vv=0;
pos(re());
if(vv)
delete u;
else
{
kk=1;
u->l=u->r=u->t=u->d=0;
u->z=0;
he(u);
p->d=u;
}
}
if(n+1!=3)
{
node *o;
o=new node;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
o->a[i][j]=p->a[i][j];
k=o->a[m][n+1];
o->a[m][n+1]=0;
o->a[m][n]=k;
v=o;
vv=0;
pos(re());
if(vv)
delete o;
else
{
kk=1;
o->l=o->r=o->t=o->d=0;
o->z=0;
he(o);
p->r=o;
}
}
if(kk==0)
{
p->z=11;
}
}
}
void main()
{
int i,j;
tree h;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
cin>>b[i][j];
}
c=10;
while(c!=0)
{
clrscr();
c=10;
h.getnode(s);
h.pre(h.re());
for(i=0;i<3;i++)
for(j=0;j<3;j++)
cout<<s->a[i][j]<<" ";
c=s->z;
}
getch();
}
#include<conio.h>
#include<iostream.h>
struct node
{
int a[3][3],z;
node *l,*r,*t,*d;
}*s,*v;
bool vv;
int b[3][3],c;
class tree
{
node *root;
public:
tree(){root=0;}
node* re(){return root;}
void getnode(node *p);
void pos(node *p)
{
if(p)
{
if(v->a[0][0]==p->a[0][0]&&v->a[0][1]==p->a[0][1]&&v->a[0][2]==p->a[0][2]
&&v->a[1][0]==p->a[1][0]&&v->a[1][1]==p->a[1][1]&&v->a[1][2]==p->a[1][2]
&&v->a[2][0]==p->a[2][0]&&v->a[2][1]==p->a[2][1]&&v->a[2][2]==p->a[2][2])
vv=1;
pos(p->l);
pos(p->d);
pos(p->t);
pos(p->r);
}
}
void he(node *p)
{
int i,j,k=1;
for(i=0;i<3;i++)
for(j=0;j<3;j++,k++)
if(p->a[i][j]!=k)
if(k!=9)
p->z++;
else
if(p->a[2][2]!=0)
p->z++;
}
void pre(node *p)
{
if(p)
{
if(!p->l&&!p->r&&!p->t&&!p->d)
{
if(p->z<c)
{
s=p;
c=s->z;
}
}
pre(p->l);
pre(p->d);
pre(p->t);
pre(p->r);
}
}
};
void tree::getnode(node *p)
{
bool kk=0;
int i,j,k,m,n;
node *q;
if(!root)
{
q=new node;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
q->a[i][j]=b[i][j];
q->z=0;
he(q);
if(q->z==0)
kk=1;
q->l=q->r=q->t=q->d=0;
p=q;
root=q;
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(p->a[i][j]==0)
{
m=i;
n=j;
}
if(kk==0)
{
if(m-1!=-1)
{
node *f;
f=new node;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
f->a[i][j]=p->a[i][j];
k=f->a[m-1][n];
f->a[m-1][n]=0;
f->a[m][n]=k;
v=f;
vv=0;
pos(re());
if(vv)
delete f;
else
{
kk=1;
f->l=f->r=f->t=f->d=0;
f->z=0;
he(f);
p->t=f;
}
}
if(n-1!=-1)
{
node *e;
e=new node;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
e->a[i][j]=p->a[i][j];
k=e->a[m][n-1];
e->a[m][n-1]=0;
e->a[m][n]=k;
v=e;
vv=0;
pos(re());
if(vv)
delete e;
else
{
kk=1;
e->l=e->r=e->t=e->d=0;
e->z=0;
he(e);
p->l=e;
}
}
if(m+1!=3)
{
node *u;
u=new node;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
u->a[i][j]=p->a[i][j];
k=u->a[m+1][n];
u->a[m+1][n]=0;
u->a[m][n]=k;
v=u;
vv=0;
pos(re());
if(vv)
delete u;
else
{
kk=1;
u->l=u->r=u->t=u->d=0;
u->z=0;
he(u);
p->d=u;
}
}
if(n+1!=3)
{
node *o;
o=new node;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
o->a[i][j]=p->a[i][j];
k=o->a[m][n+1];
o->a[m][n+1]=0;
o->a[m][n]=k;
v=o;
vv=0;
pos(re());
if(vv)
delete o;
else
{
kk=1;
o->l=o->r=o->t=o->d=0;
o->z=0;
he(o);
p->r=o;
}
}
if(kk==0)
{
p->z=11;
}
}
}
void main()
{
int i,j;
tree h;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
cin>>b[i][j];
}
c=10;
while(c!=0)
{
clrscr();
c=10;
h.getnode(s);
h.pre(h.re());
for(i=0;i<3;i++)
for(j=0;j<3;j++)
cout<<s->a[i][j]<<" ";
c=s->z;
}
getch();
}