我的程序还没弄好呢,那个程序在蛙步范围是两个连续整数的时候,才是正确的!
其余的,可以改成循环变通一下,
不知怎么搞的,我改了老半天,在测试的时候都没有成功,
恳请楼主和版主帮我改改,谢了
对不礼貌的女生收钱......
哈哈,总算让我找到错误啦!!
#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();
}