魔兽世界之一:备战

1 题目描述

魔兽世界之一:备战_第1张图片 图1 题目描述(1)
魔兽世界之一:备战_第2张图片 图2 题目描述(2)

2 题目解读

        红蓝两个司令部,都能够制造武士,要求按照题目具体要求让红蓝两个司令部同时制造武士。

3 解法

        使用C++面向对象编程的思想解题。

3.1 解题思路

        使用两个类,分别是武士类和司令部类,且司令部类是武士类的友元类。

        在司令部类中,需要使用指针指向司令部类中的武士数组,从而能够在制造武士时,找到下一个可以制造的武士,并为下一次制造武士做好准备。

3.2 设计代码

        本次代码分为类的代码和主函数代码。

3.2.1 类的设计

class Warrior { //武士
private:
	string kind;//武士种类
	int m;      //初始生命值
	int n;      //武士编号
	int amount; //武士数量
	friend class Headquarters;
public:
	Warrior() :m(0), n(0), amount(0) {}
};
class Headquarters {//司令部
private:
	string H_name;  //司令部名称
	int M;          //每个司令部一开始都有M个生命元
	Warrior w[5];   //司令部的5种武士及顺序
	int pw;         //司令部当前制造的武士
	int t_num;      //制造武士失败的次数
public:
	Headquarters(string name, int M_, unordered_map InitialHealth, string order[]);
	bool CreateWarrior(int time, bool flag);
};
Headquarters::Headquarters(string name, int M_, unordered_map InitialHealth, string order[])
:H_name(name), M(M_), pw(0), t_num(0)
{
	for (int i = 0; i < 5; i++)
	{
		w[i].kind = order[i];
		w[i].m = InitialHealth[order[i]];
	}
}
bool Headquarters::CreateWarrior(int time, bool flag)
{
	if (!flag) {
		return false;
	}
	while (M < w[pw].m && t_num < 5)
	//司令部当前生命元无法制造当前武士
	//且司令部未制造的武士数不到5个
	{
		pw = (pw + 1) % 5;
		t_num++;
	}
	cout << setw(3) << setfill('0') << time << " ";
	if (t_num == 5)
	{
		cout << H_name << " headquarter stops making warriors" << endl;
		return false;
	}
	t_num = 0;//t_num重新置零
	w[pw].n = time + 1;
	w[pw].amount++;
	cout << H_name << " " << w[pw].kind << " "
	 	 << w[pw].n << " born with strength "
		 << w[pw].m << "," << w[pw].amount
		 << " " << w[pw].kind << " in " << H_name
		 << " headquarter" << endl;
	M -= w[pw].m;
	pw = (pw + 1) % 5;
	return true;
}

3.2.2 主函数的设计

int main()
{
	string kinds[5] = {     //武士的初始生命值
		"dragon","ninja","iceman","lion","wolf"
	};
	string order_red[5] = { //红方司令部制造武士的顺序
		"iceman","lion","wolf","ninja","dragon"
	};
	string order_blue[5] = {//蓝方司令部制造武士的顺序
		"lion","dragon","ninja","iceman","wolf"
	};
	int n;
	cin >> n;
	for (int count = 1; count <= n; count++)
	{
		int M;
		cin >> M;
		unordered_map InitialHealth;
		for (int i = 0; i < 5; i++)
		{
			cin >> InitialHealth[kinds[i]];
		}
		cout << "Case:" << count << endl;
		Headquarters Red("red", M, InitialHealth, order_red), Blue("blue", M, InitialHealth, order_blue);
		int time = 0;
		bool flag1 = true, flag2 = true;
		while (flag1 || flag2) {
			flag1 = Red.CreateWarrior(time, flag1);
			flag2 = Blue.CreateWarrior(time, flag2);
			time++;
		}
	}
	return 0;
}

3.4 执行结果

魔兽世界之一:备战_第3张图片 图3 执行结果

4 解题心得

  • 题目较长,需要仔细读。
  • 注意题目中的边界与特殊情况。
  • 在一次武士制造中,如果5个武士都无法制造,则停止。

你可能感兴趣的:(C++程序设计,算法,c++)