来源:2016华为校招
题目描述:
某游戏中,玩家的任务是杀死终极BOSS。BOSS和玩家战斗方式为回合制,玩家先发动进攻。BOSS的攻击方式为:普通攻击和暴击,每4回合普通攻击的下一回合攻击为暴击。BOSS的普通攻击力为10点HP,暴击时的攻击力为普通攻击的3倍。玩家的攻击方式为:普通攻击和魔法攻击。玩家的普通攻击为17点HP,魔法攻击为60点HP。使用魔法攻击时需要消耗10点魔法值,魔法值来源有两种:初始魔法量和回合内选择魔法恢复,魔法恢复速度为4点/回合,魔法恢复回合内无法发动攻击。每轮回合开始时,玩家可以选择:普通攻击、魔法攻击或恢复魔法三种行动方式之一。现已知玩家的HP和初始魔法量,BOSS的HP,编写程序,求玩家战胜BOSS的最小回合数。
要求:1 Sec\100 MByte
输入:输入三个整数HP(0<HP1<=10000),MP(0<MP<=1000),HP2(0<HP2<=10000),分别为玩家的HP、玩家的初始魔法量和BOSS的HP。
输出:
若玩家可以战胜BOSS输出战胜BOSS的最小回合数,否则输出-1.
样例
输入:100 20 100
输出:2
编译器为g++ 4.6.4
代码如下:
#include <iostream>
using namespace std;
int bossattack(int playerhp)
{
int i,j;
i=(playerhp/70)*5;
j=(playerhp%70)/10+1;
return i+j;
}
int count=0;
int playerattack(int playermp,int bosshp)
{
int r1,r2;
if(bosshp<=0)
return 0;
if(playermp>=10)
return count=1+playerattack(playermp-10,bosshp-60);
else
{
r1=1+playerattack(playermp+4,bosshp);
r2=1+playerattack(playermp,bosshp-17);
return count=(r1<r2?r1:r2);
}
}
int main()
{
int player_hp,player_mp,boss_hp;
cin>>player_hp>>player_mp>>boss_hp;
int player_dead,boss_dead;
player_dead=bossattack(player_hp);
boss_dead=playerattack(player_mp,boss_hp);
if(boss_dead<player_dead) cout<<boss_dead<<endl;
else cout<<"-1"<<endl;
return 0;
}