感觉写得挺差;代码纯原创,没有半点参考;
以后若有空打算看看老师的代码,再来修改此文,先多花点时间再别的上面
建议:
1. 耐心点,仔细理解题意
2. 做到后面,前面若有设计得不好的地方,别犹豫,赶快改吧,改完了才知道甜头
3. 以下reference: https://blog.csdn.net/ckcz123/article/details/8734954
如果你是直接从装备跳到终极版的话,建议你先去做一做行军
传送门:http://poj.org/problem?id=3760
难度较小。
4. 同样reference: https://blog.csdn.net/ckcz123/article/details/8734954
第三,如果你总是总是WA的话,给你一个方法。
去下一个UltraCompare软件,
下载地址 ------> http://www.huacolor.com/soft/69625.html
这个东西可以将两个文本文档进行比较。
将你的所有输出保存在一个txt文件中 (fprintf总会吧)
然后复制下面我AC的代码,也保存在一个文件中,直接相比较,就能找到问题在哪。
多试几组数据,随便输入,找个几次一定可以找到问题所在。
感想:
第一次写这么长的程序,也算是一种体验。
写备战还是很快,一个晚上就立刻搞定;
装备稍微麻烦一点,由于备战的类的设计不太好,改半天;
最痛苦的还是修订版,折腾了一个下午晚上外加熬夜才写完,debug总共加起来也快一天了,仔细读题也没懂,硬是对着测试数据和正确输出结果才理解题意;
终极版有了修订版的折磨,也就不足为道......
注意:
修订版和终极版也有不同
1. wolf少了“在一个 wolf 通过主动攻击杀死敌人的次数达到偶数的时刻(次数从1开始算),在战斗完成后,该 wolf 生命值和攻击力都增加1倍。如果其杀死的敌人是lion,则攻击力和生命值先加倍,然后才吸取lion的生命值。获取总部的生命元奖励,发生在加倍之后。只有在主动攻击杀死敌人时才能有加倍的事情,反击杀死敌人则不不会发生加倍。”的特性
2. case的输出格式......
3. 升旗方面感觉也不同,可能是修订版测试数据还弱了点??
修订版中我的理解:
【假设一】
情形一:
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red刚连胜两轮,插上旗帜)
...
Flag = red, cnt = -1(blue胜)
Flag = red, cnt = -2 -> Flag = -1, cnt = 0(blue连胜两轮)
...
Flag = -1, cnt = -1(blue胜)
Flag = -1, cnt = -2 -> Flag = blue, cnt = 0(blue连胜两轮)
情形二:
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red刚连胜两轮,插上旗帜)
...
Flag = red, cnt = -1(blue胜)
Flag = red, cnt = -2 -> Flag = -1, cnt = 0(blue连胜两轮)
...
Flag = -1, cnt = 1(red胜)
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red连胜两轮)
情形三:
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red刚连胜两轮,插上旗帜)
...
Flag = red, cnt = -1(blue胜)
Flag = red, cnt = 0(red胜)
在终极版中结果发现是这样的:
【假设二】
情形一:
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red刚连胜两轮,插上旗帜)
...
Flag = red, cnt = -1(blue胜)
Flag = red, cnt = -2 -> Flag = blue, cnt = 0(blue连胜两轮)
情形二:
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red刚连胜两轮,插上旗帜)
...
Flag = red, cnt = -1(blue胜)
Flag = red, cnt = 0(red胜)
不多说了,上代码
魔兽世界之一:备战
#include<iostream>
using namespace std;
enum warriors {dragon, ninja, iceman, lion, wolf, NUMwarriors};
char str_warriors[NUMwarriors][7] = {"dragon", "ninja", "iceman", "lion", "wolf"};
enum colors {red, blue, NUMcolors};
char str_colors[NUMcolors][5] = {"red", "blue"};
class Warrior{
private:
int Strength[NUMwarriors];
int Number[NUMwarriors];
int WCSeq[NUMwarriors]; // Warrior Creating Sequence
public:
Warrior() // constructor
{
for( int i = 0; i < NUMwarriors; i++ )
Number[i] = 0;
}
friend class Headquarter;
}; // 如何联系class Headquarter 与 class Warrior?
class Headquarter{
private:
int Strength;
int Number;
Warrior W;
int Clk;
public:
Headquarter(int M, int N = 0, int C = 0) : Strength(M),Number(N),Clk(C) {}; // constructor
void SetWarrior( int nw, int sw )
{
W.Strength[nw] = sw;
}
void SetWCSeq( int nc )
{
switch(nc){
case red:
W.WCSeq[0] = iceman; W.WCSeq[1] = lion; W.WCSeq[2] = wolf; W.WCSeq[3] = ninja; W.WCSeq[4] = dragon;
break;
case blue:
W.WCSeq[0] = lion; W.WCSeq[1] = dragon; W.WCSeq[2] = ninja; W.WCSeq[3] = iceman; W.WCSeq[4] = wolf;
break;
default:
break;
}
}
int CreateWarrior( int nc, int last_cnt )
{
int cnt = last_cnt;
int w, i; // w - which warrior, i - iterator
for( i = 0; i < NUMwarriors; i++ ){
w = W.WCSeq[cnt%NUMwarriors]; // which warrior
if( Strength-W.Strength[w] >= 0 ){
Strength -= W.Strength[w];
break;
}
else
cnt++;
}
if( i >= NUMwarriors ){
printf("%03d %s headquarter stops making warriors\n", Clk, str_colors[nc]);
Clk = 0;
return -1;
}
else{
W.Number[w]++;
Number++;
printf("%03d %s %s %d born with strength %d", Clk, str_colors[nc], str_warriors[w], Number, W.Strength[w]);
printf(",%d %s in %s headquarter\n", W.Number[w], str_warriors[w], str_colors[nc]);
cnt++;
Clk++;
return cnt;
}
}
void PrintInfo();//
};
int main()
{
int ntc; // the number of test cases
cin >> ntc;
for( int tc = 1; tc <= ntc; tc++ )
{
cout << "Case:" << tc << endl;
int M; // initial strength of the two headquarters
cin >> M;
Headquarter Red(M), Blue(M);
for( int i = 0; i < NUMwarriors; i++ )
{
int sw;
cin >> sw;
Red.SetWarrior(i, sw); Blue.SetWarrior(i, sw);
}
Red.SetWCSeq(red); Blue.SetWCSeq(blue);
// Red.PrintInfo(); Blue.PrintInfo();
int res1, res2;
res1 = Red.CreateWarrior(red, 0); res2 = Blue.CreateWarrior(blue, 0);
while( res1 > 0 && res2 > 0 ){
res1 = Red.CreateWarrior(red, res1); res2 = Blue.CreateWarrior(blue, res2);
}
while( res1 > 0 )
res1 = Red.CreateWarrior(red, res1);
while( res2 > 0 )
res2 = Blue.CreateWarrior(blue, res2);
}
return 0;
}
void Headquarter::PrintInfo()//
{
cout << "Strength=" << Strength << "," << "Number=" << Number << endl;
for( int i = 0; i < NUMwarriors; i++ )
cout << W.Strength[i] << ",";
cout << endl;
for( int i = 0; i < NUMwarriors; i++ )
cout << str_warriors[W.WCSeq[i]] << ",";
cout << endl;
}//
/*
[Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11
[Error] cannot convert '<brace-enclosed initializer list>' to 'int' in assignment
-- Arrays can only be initialized like that on definition, you can't do it afterwards.
Either move the initialization to the definition, or initialize each entry manually.
*/
魔兽世界之二:装备
#include<iostream>
using namespace std;
enum warriors {dragon, ninja, iceman, lion, wolf, NUMwarriors};
char str_warriors[NUMwarriors][7] = {"dragon", "ninja", "iceman", "lion", "wolf"};
enum weapons {sword, bomb, arrow, NUMweapons};
char str_weapons[NUMweapons][6] = {"sword", "bomb", "arrow"};
enum colors {red, blue, NUMcolors};
char str_colors[NUMcolors][5] = {"red", "blue"};
int WCSeq[NUMcolors][NUMwarriors] = { {iceman,lion,wolf,ninja,dragon},
/*Warrior Creating Sequence*/ {lion,dragon,ninja,iceman,wolf} };
/* Headquarter与Warrior - 复合关系,Warrior与具体种类 - 继承关系 */
/*可以声明一个类而不定义它 --> 前向声明(forward declaration) --> 不完全类型(incompete type)
只能以有限方式使用,不能定义该类型的对象,只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数*/
class Headquarter;
class Warrior{
private:
int Strength;
int Number;
int Attribute;
Headquarter *H;
public:
Warrior( int a, int s, int N, Headquarter *h ) // constructor
{
Attribute = a; Strength = s; Number = N; H = h;
}
};
class Dragon: public Warrior{
private:
int Weapon;
double Morale;
public:
Dragon( int n, int S, int a, int s, int N, Headquarter *h ): Warrior(a,s,N,h) // constructor
{
Weapon = n%3; Morale = (double)S/s;
Dragon::AdditionalProperties();
}
void AdditionalProperties(){
printf("It has a %s,and it's morale is %.2lf\n", str_weapons[Weapon], Morale);
}
};
class Ninja: public Warrior{
private:
int Weapon[2];
public:
Ninja( int n, int a, int s, int N, Headquarter *h ): Warrior(a,s,N,h) // constructor
{
Weapon[0] = n%3; Weapon[1] = (n+1)%3;
Ninja::AdditionalProperties();
}
void AdditionalProperties(){
printf("It has a %s and a %s\n", str_weapons[Weapon[0]], str_weapons[Weapon[1]]);
}
};
class Iceman: public Warrior{
private:
int Weapon;
public:
Iceman( int n, int a, int s, int N, Headquarter *h ): Warrior(a,s,N,h) // constructor
{
Weapon = n%3;
Iceman::AdditionalProperties();
}
void AdditionalProperties(){
printf("It has a %s\n", str_weapons[Weapon]);
}
};
class Lion: public Warrior{
private:
int Loyalty;
public:
Lion( int n, int S, int a, int s, int N, Headquarter *h ): Warrior(a,s,N,h) // constructor
{
Loyalty = S;
Lion::AdditionalProperties();
}
void AdditionalProperties(){
printf("It's loyalty is %d\n", Loyalty);
}
};
class Headquarter{
private:
int Strength;
int SW[NUMwarriors]; // Strength of Warriors
int NW[NUMwarriors]; // Number of Warriors
int Number; // Number of Warriors in Total
int Color;
Warrior *W[10000];
int Clk;
public:
Headquarter( int M, int nc, int sw[], int N = 0, int C = 0 ) // constructor
{
Strength = M; Color = nc; Number = N; Clk = C;
for( int i = 0; i < NUMwarriors; i++ ){
SW[i] = sw[i]; NW[i] = 0;
}
}
int CreateWarrior( int last_cnt )
{
int cnt = last_cnt;
int a, i; // a - which warrior, i - iterator
for( i = 0; i < NUMwarriors; i++ ){
a = WCSeq[Color][cnt%NUMwarriors]; // which warrior
if( Strength-SW[a] >= 0 ){
Strength -= SW[a];
break;
}
else
cnt++;
}
if( i >= NUMwarriors ){
printf("%03d %s headquarter stops making warriors\n", Clk, str_colors[Color]);
Clk = 0;
return -1;
}
else{
Number++; NW[a]++;
printf("%03d %s %s %d born with strength %d", Clk, str_colors[Color], str_warriors[a], Number, SW[a]);
printf(",%d %s in %s headquarter\n", NW[a], str