• 大小: 6KB
    文件类型: .c
    金币: 2
    下载: 1 次
    发布日期: 2021-05-17
  • 语言: C/C++
  • 标签: A算法  A*算法  C语言  

资源简介

有一条河,河的左岸有m个传教士(Missionary)和m个野人(Cannibal),和一艘最多可乘n人的小船。约定左岸,右岸和船上或者没有传教士,或者野人数量少于传教士,否则野人会把传教士吃掉。 C语言实现A*算法!

资源截图

代码片段和文件信息

/*
有一条河,河的左岸有m个传教士(Missionary)和m个野人(Cannibal),和一艘最多可乘n人的小船。约定左岸,右岸和船上或者没有传教士,或者野人数量少于传教士,否则野人会把传教士吃掉。
版权yuan_chuan

*/

#include 
#include 

#define MAXM 10
#define MAXC 5

typedef struct mc_state
{
    int m_num;
    int c_num;
    int boat_state;
    int g;
    int h;
    int f;
    struct mc_state *next;
    struct mc_state *parent;
}mc_state;

mc_state *open;
mc_state *close;

mc_state boat[8]={{011000NULLNULL}
    {021000NULLNULL}
    {031000NULLNULL}
    {101000NULLNULL}
    {111000NULLNULL}
    {201000NULLNULL}
    {211000NULLNULL}
    {301000NULLNULL}
};
/*建立一个新的状态结点*/
mc_state * new_mc_state(void)
{
    mc_state *p;
    p=(struct mc_state *)malloc(sizeof(struct mc_state));
    p->m_num=0;
    p->c_num=0;
    p->boat_state=1;
    p->g=0;
    p->h=0;
    p->f=0;
    p->next=NULL;
    p->parent=NULL;
}
/*显示open表close表状态*/
int show(mc_state *p)
{
    if (p==NULL)
    {
        printf(“空表没有元素!“);
    }
    while (p!=NULL)
    {
        printf(“( %d %d %d f=%d )\n“p->m_nump->c_nump->boat_statep->f);
        p=p->next;
    }

}
/*判断是否存在于open或closed表中*/
int exist(mc_state *pmc_state *head)
{
    mc_state *q*prior;
    q=head;
    if (q==NULL)
    {
        return 0;
    }
    else
    {
        while ( q!=NULL)
        {
            if ( (p->m_num == q->m_num)&&(p->c_num == q->c_num)&&(p->boat_state == q->boat_state))
            {
                return 1;
            }
            q=q->next;
        }
        return 0;
    }
}

/*open表添加*/
int add_open(mc_state *p)
{
    mc_state *q*r;
    q=open;

    if (q==NULL)
    {
        open = p;
    }
    else
    {
        if ( p->f <= q->f )
        {
            p->next = open;
            open = p;
        }
        else
        {
            r=q;

            while (q!=NULL && q->f < p->f)
            {
                r=q;
                q=q->next;
            }
            q=r->next;
            r->next=p;
            p->next=q;
        }
    }
    return 1;
}
/*open表删除*/
mc_state * del_open( )
{
    mc_state *p;
    if (open==NULL)
    {
        return NULL;
    }
    else
    {
        p=open;
        open = p ->next;
        return p;
    }
}

/*close表添加*/
int add_close(mc_state *p)
{
    if (close==NULL)
    {
        close=p;
    }
    else
    {
        p->next=close;
        close=p;
    }
    return 1;
}
/*启发函数*/
int h(mc_state *p)
{
    return p->m_num+p->c_num-2*p->boat_state;
}
/*判断状态是否合法*/
int is_mc_state(mc_state *p)
{
    if ((p->m_num>MAXM)||
            (p->m_num<0)||
            (p->c_num>MAXC)||
            (p->c_num<0))
    {
        return 0;
    }
    else
    {
        if (((p->m_num>=p->c_num)&&
                (MAXM - p->m_num >= MAXC - p->c_num)
            )||
                (p-> m_num==MAXM) ||
             

评论

共有 条评论