2178 - 射击游戏
时间限制 : 1 秒
内存限制 : 128 MB
Oppsitre和vera在无限长的一维坐标系上玩射击游戏。游戏开始时,Oppsitre的位置在坐标原点0,vera的位置在d。Oppsitre的最大移动距离和最大攻击距离分别为mov1 rng1,vera的最大移动距离和最大攻击距离分别为mov2 rng2。从Oppsitre开始,两人轮流在坐标轴上自由移动(每次移动距离都不超过自身最大移动距离,且允许两人在同一坐标上)。当在某方行动的那一轮之内,对方在自己的攻击范围内,则视为现行动方获胜。
现给出mov1,mov2,rng1,rng2,d,试问双方是否有必胜策略。若双方均无必胜策略,则视为平局。
<br />
题目输入
输入包含多组测试数据。
每行五个整数,分别代表 mov1,mov2,rng1,rng2,d (每个整数的取值范围均为[1, 100,000,000])
<br />
题目输出
每个输入样例输出一行。
若Oppsitre有必胜策略,输出“Oppsitre”(不包括引号)
若vera有必胜策略,输出“vera”(不包括引号)
若双方均无必胜策略,输出“Draw”(不包括引号)
<br />
输入/输出样例
输入格式
1 58 1 58 2 2 1 1 100 50 2 1 1 100 150
输出格式
Oppsitre vera Draw
C++解答
#include <string> #include <iostream> using namespace std; class FoxAndFencing { public: string WhoCanWin(int, int, int, int, int); }; string FoxAndFencing::WhoCanWin(int mov1, int mov2, int rng1, int rng2, int d) { string w1 = "Oppsitre", w2 = "vare", draw = "Draw"; if (mov1 + rng1 >= d) return w1; if (mov2 + rng2 >= d + mov1) return w2; if (mov1 == mov2) return draw; if (mov1 > mov2) { if (mov1 + rng1 > 2 * mov2 + rng2) { return w1; } return draw; } else { if (mov2 + rng2 > 2 * mov1 + rng1) { return w2; } return draw; } } int main() { //freopen("Problem6.in", "r", stdin); //freopen("Problem6.out", "w", stdout); int a, b, c, d, e; FoxAndFencing x; while (cin >> a >> b >> c >> d >> e) { cout << x.WhoCanWin(a, b, c, d, e) << endl; } return 0; }