نمایش نتایج 1 تا 4 از 4

نام تاپیک: مرتب کردن پازل 3 در 3 به روش حریصانه

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1

    مرتب کردن پازل 3 در 3 به روش حریصانه

    سلام دوستان من یه برنامه برای مرتب کردن پازل 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();
    }
    آخرین ویرایش به وسیله whitehat : سه شنبه 23 بهمن 1386 در 17:48 عصر دلیل: برای خوانایی بیشتر از تگهای نوشتن کد استفاده کنید

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •