当前位置: 代码迷 >> C语言 >> [讨论]青蛙该怎样过桥?
  详细解决方案

[讨论]青蛙该怎样过桥?

热度:177   发布时间:2006-05-04 13:26:00.0

我的程序还没弄好呢,那个程序在蛙步范围是两个连续整数的时候,才是正确的!
其余的,可以改成循环变通一下,
不知怎么搞的,我改了老半天,在测试的时候都没有成功,
恳请楼主和版主帮我改改,谢了


----------------解决方案--------------------------------------------------------

我一会有事,白天没时间,我等晚上的吧,我写的那个很好改,等晚上改了速度就快了

你的先自己看


----------------解决方案--------------------------------------------------------
恩,我也正在查啊,不过现在累啊,想睡觉,早上4点多就醒了.


----------------解决方案--------------------------------------------------------
以下是引用soft_wind在2006-5-4 13:34:00的发言:
恩,我也正在查啊,不过现在累啊,想睡觉,早上4点多就醒了.

都被我害的,嗨嗨!


----------------解决方案--------------------------------------------------------

哈哈,总算让我找到错误啦!!
#include <stdio.h>
/*
函数功能:递归计算青蛙踩到石子的总数。
函数入口:对调后的石头位置,石头总数,最短步长,最大步长,桥的总长。
函数出口:返回青蛙踩到石子的总数。
特别注意:该函数的处理是颠倒处理,即已经把终点看成起点,起点看成终点。
*/
int findway(int a[],int num,int min,int max,int len)
{
int count1=0,count2=0,s=0,q=0,j;
if(len<=max) /*如果最大步长大于等于桥的总长,则无须踩到石子*/
return 0; /*递归出口*/
else /*处理步长小于桥长的情况*/
{
for(j=0;j<num;j++) /*青蛙挑一步,循环判断青蛙是否跳到石头的地方*/
{
if(a[j]!=len-min) /*小步长的处理*/
s++; /*如果没跳着,就加1*/
if(a[j]!=len-max) /*大步长的处理*/
q++; /*如果没跳着,加1*/
}
/*
如果跳着石头的地方,count加1,然后递归计算总跳到的石头数
*/
s!=num?(count1=1+findway(a,num,min,max,len-min)):(count1=findway(a,num,min,max,len-min));
q!=num?(count2=1+findway(a,num,min,max,len-max)):(count2=findway(a,num,min,max,len-max));
return count1>count2?count2:count1; /*函数出口,返回跳到石头数最小的数*/
}
}
main()
{
int length,minpace,maxpace,stone_num,st_place,i,k,m,n;
int aplace[20];

/*
输入数据
*/
printf("Please input the length of the bridge:");
scanf("%d",&length);
printf("Now enter the min pace and the max pace:");
scanf("%d%*c%d",&minpace,&maxpace);
printf("Input the number of the stones:");
scanf("%d",&stone_num);
printf("The places of the stone:");
for (i=0;i<stone_num;i++)
scanf("%d",&aplace[i]);

/*
为方便函数处理,把起点也终点对换。
*/
for (i=0;i<stone_num;i++)
aplace[i]=length-aplace[i];
printf("OK,loading- - - -\n");
/*
打印出结果。
*/
for(i=0;i<maxpace-minpace;i++)   /*晕死!应该是两道循环,我竟然没发现!*/
for(k=0;k<maxpace-minpace;k++)

{
if(k==0&&i==0)
m=findway(aplace,stone_num,k+minpace,k+1+minpace,length);
else if(i!=k)
m=m>(n=findway(aplace,stone_num,i+minpace,k+1+minpace,length))?n:m;
}
printf("%d",m);
getch();

}


----------------解决方案--------------------------------------------------------

呵呵,没,我也是今天才看到这题的,
昨天很早就下了,
晚上我们学校机房又不开门。


----------------解决方案--------------------------------------------------------

我下了,你还得改~~ 因为我运行了一组数据算了一年还没算出来


----------------解决方案--------------------------------------------------------
恩,那是,效率很低啊,不过,如果我得改的话,估计是得改整个算法了,我这个算法本身做得循环和递归演算够多的。哎!再想想……
----------------解决方案--------------------------------------------------------

25楼:您的程序很奇怪。在下列数据下,运行极快:
50
3 7
10
2 3 5 7 11 17 23 29 37 43而在下列数据下,运行极慢100
2 3
10
7 19 29 37 47 59 71 79 89 97
------------------------------------------------
why?


----------------解决方案--------------------------------------------------------
先告诉我答案是不是正确的啊?
----------------解决方案--------------------------------------------------------
  相关解决方案