首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请大家帮小弟我看看,这个应该如何改,题目《将军鬼上身》,小弟我按照自己想的那样写的,运用了排列组合一类的,测试数据行,但是交上去是runtime error

2013-07-01 
请大家帮我看看,这个应该怎么改,题目《将军鬼上身》,我按照自己想的那样写的,运用了排列组合一类的,测试数据

请大家帮我看看,这个应该怎么改,题目《将军鬼上身》,我按照自己想的那样写的,运用了排列组合一类的,测试数据行,但是交上去是runtime error
因为没学什么算法,现在还只是c初级,觉得自己思路也没什么问题,希望大家就在我的代码上帮我指错纠正,谢谢大家了!
将军鬼上身啦!


Time Limit:   1000MS       Memory Limit:   65535KB 
Submissions:   311       Accepted:   97 

Description打败万恶的ghost以后,将军准备回寝室告诉大伙儿这个消息,没想到杯具又发生了… 
你知道有种鬼叫“路鬼”吗?让人莫名其妙的迷路,将军就被这种鬼上身了。将军本来要上楼的,但是因为鬼上身,他要不就上一层楼,要不就下一层楼,这个是随机的,他不能控制自己啦! 
假设将军住在第M楼,刚开始将军在K楼,因为体力原因,将军只能上或者下N次楼,假设东6宿舍共有100层。现在问当体力消耗完的时候,将军刚好回到寝室那一层有多少种走法。 

例如:将军住在5楼,将军能上或者下5次楼,现在在1楼, 
那么将军将回不到寝室啦,为什么?我也不知道。 Input有多组测试数据,每组测试数据共一行,为M,N,K(0 < N < 21,0 < M,K < 101)的值,中间以空格分开,分别代表将军住在第几层,能移动几次和刚开始在第几层;Output对应每一组测试数据,输出体力消耗完时将军刚好回到寝室那一层的走法总数
Sample Input

44 5 41
5 5 1


Sample Output

5
0
Hint
我的代码:
#include<stdio.h>
#include<math.h>
int main()
{
int room,time,now,i,s1,s2,up,down,count=0,k,total,t;
while(scanf("%d%d%d",&room,&time,&now)!=EOF)
{
if(now>room)
{
t=now;now=room;room=t;
}
k=room-now;
if((time-k)%2!=0)
{
printf("0\n");
}
else
{
up=(k+time)/2;
down=(time-k)/2;
total=up+fabs(down);
if(down==0) printf("1\n");
else
{
for(i=1,s1=1;i<=up;i++)
{
s1=s1*i;
}
for(i=total,s2=1;i>total-up;i--)
{
s2=s2*i;
}
printf("%d\n",s2/s1);
}
}
}
return 0;
}

[解决办法]
如果输入是
20 7 99
将出现runtime error。
[解决办法]
溢出。s1变成了0,s2/s1就除零错误。
[解决办法]
这个题目远比你想象的难很多
1.上边已经有人指出,有可能溢出,不过算法修改一下大概就可以避免,不用写大数程序
2.不是简单的排列组合,因为有楼层限制,到了1楼就不能下,到100楼就不能上,必须要去除相应侧数据,这部分处理还是很麻烦的
[解决办法]

#include <stdio.h>

int dfs(int m, int n, int k)
{

if(n==0)//体力耗尽 如果到达将军住的楼层 返回1 如果没到 返回0 
return m==k;

int res = 0;
if(m != 1)//如果不是在第一层 可以向下走 m层数-1 体力-1 
res += dfs(m-1, n-1, k);
if(m != 100)//如果不是在顶层 可以向上走 m层数+1 体力-1 
res += dfs(m+1, n-1, k);
return res;
}

int main()
{
int m, n, k;
while(3 == scanf("%d%d%d", &m, &n, &k))
printf("%d\n", dfs(m, n, k));
return 0;
}

热点排行
Bad Request.