pascal问题求教啊!!救命!

来源:百度知道 编辑:UC知道 时间:2024/05/24 20:43:45
上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,
老师带着同学们一起做传球游戏。
游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里
拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自
己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,
传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家
表演一个节目。聪明的小蛮提出了一个有趣的问题:有多少种不同
的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到
小蛮手里。两种传球方法被视作不同的方法,当且仅当这两种方法中
,接到球的同学按接球顺序组成的序列是不同的。比如有三个同学1号
、2号、3号,并假设小蛮为1号,球传了三次回到小蛮手里的方式有
1->2->3->1和1->3->2->1,共2种。
输入: 输入共一行,有两个用空格隔开的整数n,m(3<=n<=30,1<=m<=30)。
输出: 输出共一行,有一个整数,标示符合题意的方法数。
例:
输入 3 3
输出 2

怎么做?怎么做?怎么做?

这个题做法大概是这样:
这个人传球通常是向左或向右传,于是采用递归算法:
定义球的位置为i,剩余次数为j,
每次都会向左或向右传,i从1开始向左向右传:
因为是一个圈,所以当i=1,向左时,i:=n;
而i向右时,i:=i+1;
同理继续开辟内存空间,这个函数可以这样表达:

f(i,j)=情况一:if j>0 and i=1 then f:=f(n,j-1)+f(2,j-1);
情况二:if j>0 and i=n then f:=f(n-1,j-1)+f(1,j-1);
情况三:if j>0 and (i<>1 and i<>n) then f(i,j):=f(i-1,j-1)+f(i+1,j-1);
情况四:if j=0 then if i=1 then f=1 else f=0;
主干就是这些,下面给出他的源程序(这是我的一个想法,不是标准程序)
program ball;
var m,n:integer;
function f(i:integer,j:integer):longint;//递归子程序//
begin
if (j>0) and (i=1) then f:=f(n,j-1)+f(2,j-1);
if (j>0) and (i=n) then f:=f(n-1,j-1)+f(1,j-1);
if (j>0) and (i<>1) and (i<>n) then f:=f(i-1,j-1)+f(i+1,j-1);
if (j=0) then if i=1 then f:=1 else f:=0;
end;
begin
readln(n,m);
writeln(f(1,m));
end.//这个程序过不了几个测试点,算法不好//

这个其实应该有解题报告了,那上面的程序要好很多

这个:
先看需要转几圈(判断奇偶)枚举圈数的情况。