标题:捷游公司笔试题目,关于游戏中打副本的问题!求好的解法!
只看楼主
lchpersonal
Rank: 2
等 级:论坛游民
威 望:1
帖 子:34
专家分:81
注 册:2012-7-27
结帖率:100%
已结贴  问题点数:10 回复次数:9 
捷游公司笔试题目,关于游戏中打副本的问题!求好的解法!
在打副本的时候,已知一共有N个怪物!玩家一次可以杀1个,也可以杀两个。把这N个杀完,一共有多少中杀法!
我用递归写了一个算法。但是输出的时候会有一点点的问题! 现在求一个完整的算法!

[ 本帖最后由 lchpersonal 于 2012-10-25 16:21 编辑 ]
搜索更多相关主题的帖子: 怪物 副本 
2012-10-23 23:08
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
说说你递归的思想。
2012-10-27 10:23
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:10 
我现在有别的事情,论坛来的也不勤了。四天前的帖子了,也不知道楼主还关注不关注。
我说一下我的思路,就不给代码了。这个思路,编程是很好实现的:

一共 N 个怪物,由于一次可以杀一个或两个,那么所有的杀法可以分成两类:一类是最后一次杀一个,一类是最后一次杀两个。
第一类主要就是看之前 N-1 个有多少种杀法,每种杀法都可以用来杀这 N 个,然后最后一次再杀最后一个。第二类也是同理。
所以 a[n] = a[n-1] + a[n-2]。而 a1 = 1, a2 = 2。a[n]  怎么算就不用我说了吧。
2012-10-27 10:31
w527705090
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:441
专家分:1882
注 册:2011-6-28
得分:0 
程序代码:
#include "stdafx.h"
#include"iostream"
using namespace std;
int main()
{
    double fun(int k);
    int i,j,n,b;
    double count=0,c;
    cout<<"input the number of monster:";
    cin>>n;
    for(i=1;i<=n;i++)     //每次只杀一只怪这里不计算
    {
        for(j=1;j<=int(n/2);j++)    //每次杀两只怪这里也不计算
        {
            if(i+2*j==n)     //这里算出杀一只怪和杀两只怪的次数
            {
                c=fun(i+j)/(fun(i)*fun(j));     //这里用排列组合的方法算出每种组合的种数
                cout<<"i="<<i<<",j="<<j<<",c="<<c<<endl;
                count+=c;    //累加求出种数
            }
        }
    }
    if(n%2==0)    //若为偶数只怪,最后结果加2种
    {
        b=2;
    }
    else    //否则只加一种
    {
        b=1;
    }
    cout<<"there are "<<count+b<<" ways to kill those monster!"<<endl;
    system("pause");
    return 0;
}
double fun(int k)    //算阶乘的函数
{
    int i;
    double m=1;
    for(i=1;i<=k;i++)
        m*=i;
    return m;
}
看到楼主的帖子我就有要写出程序的欲望。。。
花了好久才编出来。。。
我是一个初学者。。。
很多优越的算法和语句都还不会用。。。。
各位大大海涵啊 !!

有心者,千方百计;无心者,千难万难。
2012-10-30 15:09
lchpersonal
Rank: 2
等 级:论坛游民
威 望:1
帖 子:34
专家分:81
注 册:2012-7-27
得分:0 
回复 3楼 pangding
谢谢,最近忙着找工作,也比较忙,现在才来结贴 不好意思!

重剑无锋,大巧不工
2012-10-31 09:36
lchpersonal
Rank: 2
等 级:论坛游民
威 望:1
帖 子:34
专家分:81
注 册:2012-7-27
得分:0 
回复 4楼 w527705090
谢谢你的代码 辛苦了!

重剑无锋,大巧不工
2012-10-31 09:37
lchpersonal
Rank: 2
等 级:论坛游民
威 望:1
帖 子:34
专家分:81
注 册:2012-7-27
得分:0 
学了这么久的编程,总觉得自己欠缺解决问题的思路!

重剑无锋,大巧不工
2012-10-31 09:39
lchpersonal
Rank: 2
等 级:论坛游民
威 望:1
帖 子:34
专家分:81
注 册:2012-7-27
得分:0 
回复 2楼 pangding
程序代码:
#include<iostream>
#include <Windows.h>
using namespace std;

void Print(int n){
    if(n==0)
        return ;   
    if (n>=2)
    {     
        cout<<"2 ";
        Print(n-2);   
    }
    if (n>=1)
    {
        cout<<"1 ";
        Print(n-1);     
    }  
    cout<<endl;
}
int main(){
    int n=0;
    for(;printf("请输入怪物个数n:"),scanf("%d",&n),n ;Print(n));
    return 0;
}

看看这个代码该如何改进呢??  就是这个思想 很简单!

[ 本帖最后由 lchpersonal 于 2012-10-31 09:48 编辑 ]

重剑无锋,大巧不工
2012-10-31 09:46
w527705090
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:441
专家分:1882
注 册:2011-6-28
得分:0 
回复 8楼 lchpersonal
这用的是递归的方法,递归的方法很好用,我还在学习当中。。。。

有心者,千方百计;无心者,千难万难。
2012-10-31 21:01
zhourongqing
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-10-31
得分:0 
斐波拉契
2012-10-31 21:41



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




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

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