c语言代码为500-600行,抄袭别人也可以。

500行代码很难找。...

只有一个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);

}

}