标题:[讨论]青蛙该怎样过桥?
只看楼主
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
得分:0 
以下是引用–★–在2006-5-5 8:53:00的发言:

建议你先运行斑竹的程序,并设法略加修改,让我们看到青蛙最终过桥的细节。


您是要知道整个青蛙过河其跳到的步子的各个数轴坐标?


对不礼貌的女生收钱......
2006-05-05 16:28
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
得分:0 
/*

想了一个晚上,终于把这道题解决了,本程序算法跟我上面的程序类似,不再赘述.但其执行效率是非常高的,我测试了一下,比版主的程序还要高.程序还给出了一条青蛙过桥的最短路径(即在踩到最少石头的情况下跳最少次).


*/
#include <stdio.h>
#include <stdlib.h>
main()
{
int *jump=NULL;
int i,j,k,length,min,max,stone_num,temp,minous,total,counter=0,tag=0,m,n=1,flag=0;
int a[100];
printf("Please input the length of the bridge:\n");
scanf("%d",&length);
jump=(int *)malloc(sizeof(int)*(length+1));
for(i=0;i<length;i++)
*(jump+i)=0;
printf("Please input the minium pace and the maxnium pace:\n");
scanf("%d%*c%d",&min,&max);
printf("Please input the number of the stones:\n");
scanf("%d",&stone_num);
printf("Now enter the place of the stones:\n");
for(i=0;i<stone_num;i++)
{
scanf("%d",&temp);
*(jump+temp)=1;
}
for(i=0;i<min;i++)
*(jump+i)=-1;
if(2*min>max)
for(i=max+1;i<2*min;i++)
*(jump+i)=-1;
for(i=2*min;i<=length-min;i++)
{
for(j=i-max;j<=i-min;j++)
{
if(j<0) continue;
if(*(jump+j)!=-1)
{
if(counter==0)
{
minous=*(jump+j);
counter++;
}
else minous=*(jump+j)>minous?minous:*(jump+j);
}
else tag++;
}
counter=0;
if(tag==max-min+1)
*(jump+i)=-1;
else *(jump+i)+=minous;
tag=0;
}
a[0]=length;
do {
for(k=length-max;k<=length-min;k++)
{
if(*(jump+k)!=-1)
{
if(counter==0)
{
total=*(jump+k);
m=k;
counter++;
}
else if(total>*(jump+k))
{
total=*(jump+k);
m=k;
}
}
}
counter=0;
if(flag==0)
{
printf("%d\n",total);
flag=1;
}
a[n++]=length=m;
} while(m>max);
a[n]=0;
for(i=n;i>=0;i--)
{
if(i!=0)
printf("%d->",a[i]);
else printf("%d",a[i]);
}
free (jump);
getch();
}

/*我取了这组实验数据校验:桥长:100;步长:3 7;石头数:10;位置:12 24 26 35 39 46 58 67 79 82.相比,可见效率.*/
另外,版主,您的程序我发现了一个小问题,就是clock()函数只能测到在毫秒级,当您的程序要花较长的时间时,如3.200秒,clock()只记录下200吧?这个我不敢肯定,请您回下。

对不礼貌的女生收钱......
2006-05-06 08:51
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
得分:0 

显然是记录了全部时间,你可以加了getch();过几秒,看下结果就知道了

我的程序递归肯定效率高不了~~ 就是懒人的做法,不过还可以修改


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-06 11:38
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
得分:0 

我得走了,你的程序有个隐含错误 现在就是不告诉你,嘿嘿


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-06 11:43
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
得分:0 
晕!版主,你乍老爱吊我胃口!
我再找找,找不到你得说出来呀,

对不礼貌的女生收钱......
2006-05-06 11:49
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
得分:0 

你的程序有个硬伤,就是只能运行桥长较小的情况,根据题目要求
桥最长10^9 不管你malloc还是用链表,显然这很难满足
我的程序我稍微修改了下,你给的那组数据运行花了0.000秒

[CODE]
#include "stdio.h"
#include "malloc.h"
#include "time.h"

long num_min=0,bridge_len,*array,stone_sum;
int min,max;

int Search(long i)
{
long j;

for(j=0;j<stone_sum && i>=array[j];j++)
;
return j-1;
}

void Frog_Jump(long i,long total)
{
int j;
long num,k;

for(j=min;j<=max;j++)
{
num=total;
k=Search(i+j);
if( k<stone_sum-1 )
{
if(k>=0 && array[k]==i+j)
num=total+1;
if( array[k+1]-i-j>=min+max%min)
{
Frog_Jump(array[k+1]-min-max%min,num);
break;
}
else
Frog_Jump(i+j,num);
}
else
{
if(array[k]==i+j)
num=total+1;
if( num<num_min)
num_min=num;
}
}
}

int main()
{
long i,start,end;

printf("please input the length of bridge :\n");
scanf("%ld",&bridge_len);
printf("please input the range of frog :\n");
scanf("%d%d",&min,&max);
printf("please input the num of stone :\n");
scanf("%ld",&stone_sum);
array=(long *) malloc (sizeof(long)*stone_sum);
for(i=0;i<stone_sum;i++)
scanf("%ld",array+i);
start=clock();
if(max==min)
{
for(i=0;i<stone_sum;i++)
if(array[i]%max==0)
num_min++;
}
else
{
num_min=stone_sum;
Frog_Jump(0,0);
}
printf("\n%ld\n",num_min);
free(array);
end=clock();
printf("The computation took %0.3f seconds.\n",(end-start)/1000.0);
return 0;
}


[/CODE]


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-06 16:19
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
得分:0 


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-06 16:20
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
得分:0 

哎,我无话可说,不过还是谢谢老大您帮我提出错误,让我又检测到一个错误,记数倒是没问题,
就是在显示各个步点时,出现了小问题,明天我再改下,至于这个问题就在明天结束它的历史,
不能花太长时间在上面了.

对不礼貌的女生收钱......
2006-05-06 16:33
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
得分:0 

你帮我多测试下我的程序, 还有上次那个石头分两堆的问题 你帮我测试下

主要是现在只能看运行速度
但真正的结果对不对,很难确保,总不能靠人自己模拟


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-06 16:37
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
得分:0 
哦,那个石头分堆,我没去具体想
老大您放心吧,我在测试程序时会以你程序为准的,同时测试就知道对错了。
至于石头那个问题,我没时间了,我明天得努力写作业啊!!!
不过有空一定帮您测试。

对不礼貌的女生收钱......
2006-05-06 16:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-61745-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.163841 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved