c语言代码为500-600行,抄袭别人也可以。
只有一个300多行的关于商人过河的数学题。
# include & ltstdio.h & gt
# include & ltstdlib.h & gt
#定义maxloop 100 //最大层数,可针对不同的扩展方式自动调整。
#定义pristnum 3
#定义从属编号3
结构SPQ
{
int sr,pr;//船来回跑后河右岸的商贾仆从数量。
int sl,pl;//船来回跑后河左岸的商贾仆从数量。
int ssr,spr//回来时船上人数(从左到右)
int sst,spt//去的时候车上人数(从右到左)
int循环;//此节点所在的层数
结构SPQ *upnode,* nextnode//本节点的父节点和同级下一个节点的地址。
} spq
int loopnum//记录总膨胀时间。
int openednum//记录展开的节点数。
未开放的内部;//记录要扩展的节点数。
int resultnum
结构SPQ *已打开;
结构SPQ * oend;
结构SPQ *未开封;
结构SPQ * uend;
结构SPQ *结果;
void initiate();
void release mem();
void show result();
void addtoopened(结构SPQ * ntx);
int search();
void goon();
int stretch(结构SPQ * ntx);
void记录器();
void main()
{
int标志;//标记扩展是否成功。
for(;;)
{
initiate();
flag = search();
if(flag == 1)
{
记录器();
release mem();
show result();
goon();
}
其他
{
Printf("找不到合格的解决方案");
release mem();
goon();
}
}
}
无效启动()
{
int x;
char选择;
uend = unopened =(结构SPQ *)malloc(sizeof(spq));
if(uend==NULL)
{
printf(" \ n内存不足!\ n ");
退出(0);
}
unopenednum = 1;
opened num = 0;
未开封-& gt;upnode =未打开;//保存父节点的地址,形成一个链表。
未开封-& gt;nextnode =未打开;
未开封-& gt;sr = slavenum
未开封-& gt;pr = pristnum
未开封-& gt;sl = 0;
未开封-& gt;pl = 0;
未开封-& gt;SST = 0;
未开封-& gt;SPT = 0;
未开封-& gt;SSR = 0;
未开封-& gt;SPR = 0;
未开封-& gt;loop = 0;
Printf("标题:有n个商人和m个仆人来到河边,打算乘船从右岸到左岸。\ n ");
Printf("这艘船的载重量是两个人。在任何时候,如果仆人的数量超过商人的数量,仆人\ n ");
Printf("会杀了那个商人。他们怎么能安全地用这条船过河呢?\ n ");
printf(" \ n n和m的默认值都是3 \ n ");
for(;;)
{
printf(" \ n是否要修改它?(Y/N)");
scanf("%s ",& amp选择);
choice=toupper(选择);
if(choice=='Y ')
{
printf(" \ n请输入商人人数");
for(;;)
{
scanf("%d ",& ampx);
if(x & gt;0)
{
未开封-& gt;pr = x;
打破;
}
elseprintf(" \ n输入值应该大于0!\ n请重新输入");
}
printf(" \ n请输入员工人数");
for(;;)
{
scanf("%d ",& ampx);
if(x & gt;0)
{
未开封-& gt;Sr = x;
打破;
}
elseprintf(" \ n输入值应该大于0!\ n请重新输入");
}
打破;
}
if(choice = = ' N ')break;
}
}
int搜索()
{
int标志;
结构SPQ * ntx;//提供指向要展开的节点的指针。
for(;;)
{
ntx =未开封;//从要扩展的链表中提取前面的一个。
if(ntx-& gt;loop == maxloop)
返回0;
addtoopened(ntx);//将ntx添加到展开的列表中,并从要展开的列表中移除该节点。
flag = stretch(ntx);//扩展ntx,返回-1,0,1。
if(flag == 1)
返回1;
}
}
整数拉伸(结构SPQ *ntx)
{
int fsr,fpr//右岸的人数
int fsl,fpl//左岸的人数
int sst,spt//出发时船上的人数
int ssr,spr//返回时船上的人数
结构SPQ *新节点;
for(SST = 0;sst & lt= 2 ;Sst++) //讨论不同的可能性,判断是否满足条件。
{
fsr = ntx-& gt;Sr;
FPR = ntx-& gt;pr;
fsl = ntx-& gt;sl;
fpl = ntx-& gt;pl;
if((SST & lt;= fsr)& amp;& amp((2-SST)& lt;= fpr))//满足数量限制。
{
SPT = 2-SST;
fsr = fsr-SST;
FPR = FPR-SPT;
if((FPR = = 0)& amp;& amp(fsr == 0))//搜索成功。
{
newnode =(结构SPQ *)malloc(sizeof(spq));
if(newnode==NULL)
{
printf(" \ n内存不足!\ n ");
退出(0);
}
新节点-& gt;upnode = ntx//保存父节点的地址,形成一个链表。
新节点-& gt;nextnode = NULL
新节点-& gt;Sr = 0;
新节点-& gt;pr = 0;
新节点-& gt;sl =打开-& gt;Sr;
新节点-& gt;pl =已打开-& gt;pr;
新节点-& gt;sst = sst
新节点-& gt;spt = spt
新节点-& gt;SSR = 0;
新节点-& gt;SPR = 0;
新节点-& gt;loop = ntx-& gt;loop+1;
oend-& gt;nextnode = newnode
oend = newnode
opened num++;
返回1;
}
else if((FPR-fsr)* FPR & gt;= 0) //判断商家数量是否必须大于等于仆人数量。
{
fsl = fsl+SST;
fpl = fpl+SPT;
for(SSR = 0;ssr & lt= 1 ;Ssr++) //返回
{
int ffsl,ffpl
if((SSR & lt;= fsl)& amp;& amp((1-SSR)& lt;= fpl))
{
SPR = 1-SSR;
ffsl = fsl-SSR;
ffpl = fpl-SPR;
if((ffpl-ffsl)* ffpl & gt;= 0)
{//如果符合要求,分配内存,支付值。
int ffsr,ffpr
ffsr = fsr+SSR;
ffpr = FPR+SPR;
newnode =(结构SPQ *)malloc(sizeof(spq));
if(newnode==NULL)
{
printf(" \ n内存不足!\ n ");
退出(0);
}
新节点-& gt;upnode = ntx//保存父节点的地址,形成一个链表。
新节点-& gt;sr = ffsr
新节点-& gt;pr = ffpr
新节点-& gt;sl = ffsl
新节点-& gt;pl = ffpl
新节点-& gt;sst = sst
新节点-& gt;spt = spt
新节点-& gt;ssr = ssr
新节点-& gt;spr = spr
新节点-& gt;loop = ntx-& gt;loop+1;
uend-& gt;nextnode = newnode
uend = newnode
unopenednum++;
}
}
}
}
}
}
返回0;
}
void addtoopened(结构SPQ *ntx)
{
未打开=未打开-& gt;nextnode
unopenednum-;
if (openednum == 0)
oend = opened = ntx
oend-& gt;nextnode = ntx
oend = ntx
opened num++;
}
无效记录器()
{
int i,loop
结构SPQ *新节点;
结构SPQ * ntx;
loop = oend-& gt;循环;
ntx = oend
result num = 0;
for(I = 0;我& lt=循环;i++)
{
newnode =(结构SPQ *)malloc(sizeof(spq));
if(newnode==NULL)
{
printf(" \ n内存不足!\ n ");
退出(0);
}
新节点-& gt;Sr = ntx-& gt;Sr;
新节点-& gt;pr = ntx-& gt;pr;
新节点-& gt;sl = ntx-& gt;sl;
新节点-& gt;pl = ntx-& gt;pl;
新节点-& gt;SST = ntx-& gt;sst
新节点-& gt;SPT = ntx-& gt;spt
新节点-& gt;SSR = ntx-& gt;ssr
新节点-& gt;SPR = ntx-& gt;spr
新节点-& gt;nextnode = NULL
ntx = ntx-& gt;upnode
如果(i == 0)
result = newnode
新节点-& gt;nextnode = result
result = newnode
result num++;
}
}
void releasemem()
{
int I;
结构SPQ*无节点;
for(I = 1;我& ltopenednumi++)
{
nodefree =已打开;
打开=打开-& gt;nextnode
免费(nodefree);
}
for(I = 0;我& ltunopenednumi++)
{
nodefree =未打开;
未打开=未打开-& gt;nextnode
免费(nodefree);
}
}
void showresult()
{
int I;
int fsr,fpr//右岸的人数
int fsl,fpl//左岸的人数
结构SPQ*无节点;
Printf("%d个商人",结果->;pr);
Printf("%d个仆人",结果->;Sr);
Printf("%d个商人",结果->;pl);
Printf("%d个仆人",结果->;sl);
for(I = 1;我& ltresultnumi++)
{
nodefree = result
结果=结果-& gt;nextnode
免费(nodefree);
printf(" \ n \ n \ t左岸人数和右岸人数\ n ");
Printf ("Round %d \n ",I);
fpl = result-& gt;pl-result-& gt;spt +结果-& gt;spr
FPR = result-& gt;pr-result->;spr
fsl = result-& gt;sl - result ->sst +结果-& gt;ssr
fsr = result-& gt;sr -结果-& gt;ssr
Printf("商家% 8d% 8d \ t
Printf("仆人% 8d% 8d \ t
printf(" Merchant % 8d % 8d \ t-& gt;\t%8d\n ",结果-& gt;pl,结果-& gt;spr,result ->pr-result->;SPR);
printf(" Servant % 8d % 8d \ t-& gt;\t%8d\n ",结果-& gt;sl,结果-& gt;ssr,结果-& gt;sr -结果-& gt;SSR);
}
printf(" \ n所有商人和仆人都到达彼岸");
免费(结果);
}
void goon()
{
char选择;
for(;;)
{
Printf("要继续吗?(是/否)\ N ");
scanf ("%s ",& amp选择);
choice=toupper(选择);
if(choice = = ' Y ')break;
if(choice = = ' N ')exit(0);
}
}