我设计的三个野人ic三个传教士im,船上能在两个人,乘船左岸到右岸用boatf,右岸到左岸用boatr,具体程序如下,但是好像出现了死循环,却看不出那里出了问题,请各位高手帮个忙看一看,谢谢啦!
#include<stdio.h>
int im,ic,ii,ij;
int boatf(int im,int ic,int ii)
{
switch(ii)
{
case 1:printf("M:%d C:%d\n",im--,ic--);break;
case 2:printf("M:%d C:%d\n",im=im-2,ic);break;
case 3:printf("M:%d C:%d\n",im,ic=ic-2);break;
case 4:printf("M:%d C:%d\n",im--,ic);break;
case 5:printf("M:%d C:%d\n",im,ic--);break;
default:printf("error\n");
}
}
int boatr(int im,int ic,int ij)
{
switch(ij)
{
case 1: printf("M:%d C:%d\n",im++,ic++);break;
case 2:printf("M:%d C:%d\n",im=im+2,ic);break;
case 3:printf("M:%d C:%d\n",im,ic=ic+2);break;
case 4:printf("M:%d C:%d\n",im++,ic);break;
case 5:printf("M:%d C:%d\n",im,ic++);break;
default:printf("error\n");
}
}
void main()
{
im=3;
ic=3;
lflag:
for(ii=1;ii<=5;ii++)
{
boatf(im,ic,ii);
if(im<ic||im<0||ic<0)
{
printf("the %dth plan to R is fail!\n",ii);
}
else if(im==0&&ic==0)
{
printf("the plan to Pass the river is complete!\n");
break;
}
else
{
for(ij=1;ij<=5;ij++)
boatr(im,ic,ij);
if(im<ic||im<0||ic<0)
{
printf("the %dth plan to F is fail!\n",ij);
}
else
goto lflag;
}
}
}
你把问题看简单了。你的程序有几个问题:
int boatf(int im,int ic,int ii)在这个函数中改变的im和ic的值只是改变的两个临时变量的值,并没有改变全局变量im和ic的值。你可以把前两个参数去掉。
还有,你的for循环并不是可以正确遍历所有情况的。
我写了一个程序,tc2.0通过了。在执行到第145种方案时成功。
程序中case的几个顺序请不要任意改动,因为ltor和rtol函数中他们有对应关系。
本题目一共有5的13次方种方案,我的算法能排除很多非法方案。当然,我的算法不是最好的,希望高手能提供更高效的算法。
做这个程序累坏了我几万个脑细胞,楼主给多加点分吧!谢谢了!
#include<stdio.h>