pRule=NewRule(i,j);
if(pRule==NULL)returnNULL;
pRule->pNext=pRules;
pRules=pRule;
}
}
returnpRules;
}
intIsGoal(structNODE*pNode)
{
if(pNode->m==0&&
pNode->c==0&&
pNode->b==0)
return1;
else
return0;
}
intSafe(structNODE*pNode)
{
if(pNode->m<0||
pNode->c<0||
pNode->m>M||
pNode->c>C||
pNode->c>M)return0;
if(pNode->m==M||
pNode->m==0)return1;
return(pNode->m==pNode->c);
}
voidPrintNode(structNODE*pNode)
{
printf("(%d,%d,%d)\n",pNode->m,pNode->c,pNode->b);
}
voidPrintRule(structRULE*pRule)
{
printf("(%d%d)\n",pRule->m,pRule->c);
}
voidPrintNodeList(structNODE*pList)
{
while(pList)
{
printf("(%d,%d,%d)\n",pList->m,pList->c,pList->b);
pList=pList->pNext;
}
}
voidPrintRuleList(structRULE*pList)
{
if(pList==FAIL)
{
printf("nosolution!
\n");
return;
}
if(pList==NULL)
{
printf("()\n");
return;
}
else
{
printf("(0,0,0)\n");
}
while(pList)
{
pList=pList->pNext;
}
}
intLength(structNODE*pList)
{
if(pList==NULL)return0;
returnLength(pList->pNext)+1;
}
structNODE*ConsNode(structNODE*pNode,structNODE*pList)
{
pNode->pNext=pList;
returnpNode;
}
structRULE*ConsRule(structRULE*pRule,structRULE*pList)
{
pRule->pNext=pList;
returnpRule;
}
structNODE*Gen(structRULE*pRule,structNODE*pData)
{
if(pData->b==1)
{
returnNewNode(pData->m-pRule->m,pData->c-pRule->c,0);
}
else
{
returnNewNode(pData->m+pRule->m,pData->c+pRule->c,1);
}
}
structRULE*CopyRule(structRULE*pRule)
{
returnNewRule(pRule->m,pRule->c);
}
structNODE*In(structNODE*pNode,structNODE*pList)
{
if(pList==NULL)returnNULL;
if(Equal(pNode,pList))returnpList;
returnIn(pNode,pList->pNext);
}
voidFreeNodeList(structNODE*pNodeList)
{
structNODE*pNode=NULL;
while(pNodeList)
{
pNode=pNodeList;
pNodeList=pNodeList->pNext;
free(pNode);
}
}
voidFreeRuleList(structRULE*pRuleList)
{
structRULE*pRule=NULL;
if(pRuleList==FAIL)return;
while(pRuleList)
{
pRule=pRuleList;
pRuleList=pRuleList->pNext;
free(pRule);
}
}
structRULE*Backtrack1(structNODE*pDataList,intbound)
{
structNODE*pData=NULL,*pRData=NULL,*pRDataList=NULL;
structRULE*pRule=NULL,*pRules=NULL,*pPath=NULL;
pData=pDataList;
if(In(pData,pDataList->pNext))
{
returnFAIL;
}
if(IsGoal(pData))
{
FreeNodeList(pDataList);
returnNULL;
}
if(!
Safe(pData))
{
returnFAIL;
}
if(Length(pDataList)>bound)
{
returnFAIL;
}
pRules=g_pRuleSet;
PrintNode(pDataList);
while(pRules)
{
pRule=pRules;
pRules=pRules->pNext;
pRData=Gen(pRule,pData);
if(pRData==NULL)returnFAIL;
if(!
Safe(pRData))
{
free(pRData);
continue;
}
pRDataList=ConsNode(pRData,pDataList);
pPath=Backtrack1(pRDataList,bound);
if(pPath==FAIL)
{
free(pRData);
continue;
}
pRule=CopyRule(pRule);
if(pRule==NULL)returnFAIL;
returnConsRule(pRule,pPath);
}
returnFAIL;
}
voidmain(void)
{
structNODE*pData=NULL;
structRULE*pPath=NULL;
Input_MCK();
g_pRuleSet=InitRules();
pData=NewNode(M,C,1);
pPath=Backtrack1(pData,20);
PrintRuleList(pPath);
if(pPath==FAIL)
{
free(pData);
}
FreeRuleList(pPath);
FreeRuleList(g_pRuleSet);
}
四、程序运行结果
五、实验总结:
通过本次实验,我用c语言编程实现了野人与传教士过河问题,运用人工智能中学过的相关算法知识解决了传教士和野人渡河问题找出能够解决问题的所有可行方案。