• 大小: 8KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-05
  • 语言: 其他
  • 标签:

资源简介

问题:设有3个传教士和3个野人来到河边,打算乘一只船从右岸渡到左岸去。该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过河去? 综合上述信息提取限制信息为: 1、修道士和野人都会划船,但船一次只能载2人; 2、在任何岸边,野人数不能超过修道士数,否则修道士将会被野人吃掉

资源截图

代码片段和文件信息

#include 
#include 
                                        /*人工智能大作业-陈卫东-学号DY0903103*/
#define MER 3 /*传教士总人数*/
#define COU 3 /*野人总人数*/
#define REN 2 /*船一次可以乘坐的最多人数*/

struct NODE
{
int mer; /*在左岸的传教士人数*/
int cou; /*在左岸的野人人数*/
int b; /*b的取值为1或0:当b=1表示船在左岸当b=0表示船在右岸*/
double g; /*该节点的g值*/
double f; /*该节点的f值*/
struct NODE *pFather; /*指向该节点的父节点*/
struct NODE *pNext; /*指针,在OPEN表或者CLOSED表中,指向下一个元素*/
};

struct NODE *g_pOpen = NULL; /*OPEN表*/
struct NODE *g_pClosed = NULL; /*CLOSED表*/


int Equal(struct NODE *pNode1 struct NODE *pNode2)             /*功能函数用于判断判断两个节点所表示的状态是否相等 ,有返回值 */         

{
            if (pNode1->mer == pNode2->mer &&                       /*pNode1为指向节点1的指针 , pNode2为指向节点2的指针*/
pNode1->cou == pNode2->cou &&
pNode1->b == pNode2->b) return 1;
else return 0;                                         /*当两个节点所表示的状态相等时,返回1,否则返回0*/    
 
}

struct NODE *NewNode(int mer int cou int b)                 /*功能函数用于动态产生一个节点,其状态值由参数mer,cou,b给定,有返回值 */  

{
struct NODE *pNode = NULL;
pNode = malloc(sizeof(struct NODE));
if (pNode == NULL) return NULL;
pNode->mer = mer;
pNode->cou = cou;
pNode->b = b;
pNode->g = 0;
pNode->f = 0;
pNode->pFather = NULL;
pNode->pNext = NULL;
return pNode;                                        /*当指向新产生的节点的指针,或者空间不够时,返 回NULL */ 
}

void FreeList(struct NODE *pList)                             /*功能函数用于释放动态的链表,无返回值 */  

{
struct NODE *pNode = NULL;
while (pList)
{
pNode = pList;
pList = pList->pNext;
free(pNode);
}
}

struct NODE *In(struct NODE *pNode struct NODE *pList)      /*功能函数用于判断节点是否在链表中,有返回值 */     

{
if (pList == NULL) return NULL;                    /* pNode是指向给定节点的指针, 而pList是指向给点链表的指针 */  
if (Equal(pNode pList)) return pList;
return In(pNode pList->pNext);                     /* 若pNode属于pList,返回以pNode为首的链表的后一部分;否则返回NULL */ 
}

struct NODE *Del(struct NODE *pNode struct NODE *pList)      /*功能函数用于从链表中删除不符合条件节点,有返回值 */    

{
if (pList == NULL) return pList;
if (Equal(pNode pList)) return pList->pNext;
pList->pNext = Del(pNode pList->pNext);
return pList;                                           /*返回删除节点后的链表 */ 
}

struct NODE *AddToOpen(struct NODE *pNode struct NODE *pOpen)  /*功能函数用于将放到OPEN表中的节点函数的f值按从小到大顺序排列,有返回值 */ 

{
if (pOpen == NULL)                                  /*pOpen为指向OPEN表的指针*/ 
{
pNode -> pNext = NULL;                 /*若OPEN表为空,则pOpen=Null  */ 
return pNode;
}
if (pNode->f < pOpen->f) /*若OPEN表非空,而给定节点的f值小于OPEN表第一个节点的f值 */ 
{
pNode->pNext = pOpen; /*则排序,插入到OPEN的最前面 */ 
return pNode;
}
pOpen->pNext = AddToOpen(pNode pOpen->pNext); /*递归函数 */ 
return pOpen;
}

struct NODE *AddToClosed(struct NODE *pNode struct NODE *pClosed)  /*功能函数用于将符合条件的节点插入到CLOSED表中 ,有返回值 */ 

{
pNode->pNext = pClosed;                            /*pClosed为指向CLOSED表的指针 */
return pNode;                     

评论

共有 条评论

相关资源