主题:[讨论]致 ltc.owner 有关问题另一实现
不好意思,因为太忙,所以这两天没很好滴在论坛里学习。首先,对ltc.owner同学表示歉意,可能你对我说话的方式有所误解,我只是对原帖http://bbs.pfan.cn/post-319036.html 中9楼的解法表示钦佩,并非对你有所侧指。其实大家都一样,并无谁高谁低之分,可能有所区分只是个性的差矣而已。
看来你对rpg很感兴趣,那么就希望今后多来论坛参与讨论。对于rpg我知之甚少,所以可能无法直接对你提供帮助,至于你提出的方法和方向的问题,我想在你的帖子里同仁志士们都已说的很清楚了。对于你提的有关“参加者”的问题,我还是想说9楼的代码是C之使用穷举的典范,你该多多阅读。另外,你在原帖里提了如何使用C++完成的问题,今天休息的时候我写了一些代码,希望对你有所帮助,其实还是穷举的应用,只不过多了一些container,iterator。如果你能对STL有所了解,可能读起来比C的方式更“人性化”一些。本想直接回复,不想你结贴了。
另附,对你立即马上使用简体中文表示支持。:)
代码如下:
#include <set>
#include <string>
#include <iostream>
using namespace std;
typedef set<bool> VOTER; //参加者
typedef set<bool>::const_iterator ITER; //迭代器
class TCondition //一个条件类型,实为function object当初曾试图推至泛型,所以使用了f.o. 可用function完成
{
public:
TCondition()
: _nCount(0) {}
void operator() (const VOTER& set_a, const VOTER& set_b, const VOTER& set_c,
const VOTER& set_d, const VOTER& set_e) const; // overload ()
unsigned Count() const { return _nCount; }
private:
mutable unsigned _nCount;
};
int main(int, char **, char **)
{
VOTER set_a, set_b, set_c, set_d, set_e; //5个准参加者,表为set,每一element为2个状态 true false
set_a.insert(false);
set_a.insert(true);
set_b.insert(false);
set_b.insert(true);
set_c.insert(false);
set_c.insert(true);
set_d.insert(false);
set_d.insert(true);
set_e.insert(false);
set_e.insert(true);
TCondition condition;
condition(set_a, set_b, set_c, set_d, set_e); //判断
std::cout << "Counter is : " << condition.Count() << std::endl; //结果数
}
inline void
TCondition::operator() (const VOTER& set_a, const VOTER& set_b, const VOTER& set_c,
const VOTER& set_d, const VOTER& set_e) const
{
for (ITER it_a = set_a.begin(); it_a != set_a.end(); ++it_a)//枚举每个set的每个状态....
for (ITER it_b = set_b.begin(); it_b != set_b.end(); ++it_b)
for (ITER it_c = set_c.begin(); it_c != set_c.end(); ++it_c)
for (ITER it_d = set_d.begin(); it_d != set_d.end(); ++it_d)
for (ITER it_e = set_e.begin(); it_e != set_e.end(); ++it_e)
{
if (*it_a == true) //A参加 则B参加
if (!(*it_b == true)) continue;
if ((!*it_b || !*it_c) == false) //B...C...
continue;
if (*it_c != *it_d) //C...D...
continue;
if ((!*it_d && !*it_e) == true) //D...E....
continue;
if (*it_e == true) //E...A....D.....
if ( *it_a != true || *it_d != true) continue;
std::cout << static_cast<string>(*it_a ? "A参加." : "A不参加.") << std::endl
<< static_cast<string>(*it_b ? "B参加." : "B不参加.") << std::endl
<< static_cast<string>(*it_c ? "C参加." : "C不参加.") << std::endl
<< static_cast<string>(*it_d ? "D参加." : "D不参加.") << std::endl
<< static_cast<string>(*it_e ? "E参加." : "E不参加.") << std::endl;
_nCount++;
}
}
结果同样为 A不参加, B不参加, C参加, D参加, E不参加
祝顺利!
原题附上:
A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
人参加了竞赛:
(1)A参加时,B也参加;
(2)B和C只有一个人参加;
(3)C和D或者都参加,或者都不参加;
(4)D和E中至少有一个人参加;
(5)如果E参加,那么A和D也都参加。
看来你对rpg很感兴趣,那么就希望今后多来论坛参与讨论。对于rpg我知之甚少,所以可能无法直接对你提供帮助,至于你提出的方法和方向的问题,我想在你的帖子里同仁志士们都已说的很清楚了。对于你提的有关“参加者”的问题,我还是想说9楼的代码是C之使用穷举的典范,你该多多阅读。另外,你在原帖里提了如何使用C++完成的问题,今天休息的时候我写了一些代码,希望对你有所帮助,其实还是穷举的应用,只不过多了一些container,iterator。如果你能对STL有所了解,可能读起来比C的方式更“人性化”一些。本想直接回复,不想你结贴了。
另附,对你立即马上使用简体中文表示支持。:)
代码如下:
#include <set>
#include <string>
#include <iostream>
using namespace std;
typedef set<bool> VOTER; //参加者
typedef set<bool>::const_iterator ITER; //迭代器
class TCondition //一个条件类型,实为function object当初曾试图推至泛型,所以使用了f.o. 可用function完成
{
public:
TCondition()
: _nCount(0) {}
void operator() (const VOTER& set_a, const VOTER& set_b, const VOTER& set_c,
const VOTER& set_d, const VOTER& set_e) const; // overload ()
unsigned Count() const { return _nCount; }
private:
mutable unsigned _nCount;
};
int main(int, char **, char **)
{
VOTER set_a, set_b, set_c, set_d, set_e; //5个准参加者,表为set,每一element为2个状态 true false
set_a.insert(false);
set_a.insert(true);
set_b.insert(false);
set_b.insert(true);
set_c.insert(false);
set_c.insert(true);
set_d.insert(false);
set_d.insert(true);
set_e.insert(false);
set_e.insert(true);
TCondition condition;
condition(set_a, set_b, set_c, set_d, set_e); //判断
std::cout << "Counter is : " << condition.Count() << std::endl; //结果数
}
inline void
TCondition::operator() (const VOTER& set_a, const VOTER& set_b, const VOTER& set_c,
const VOTER& set_d, const VOTER& set_e) const
{
for (ITER it_a = set_a.begin(); it_a != set_a.end(); ++it_a)//枚举每个set的每个状态....
for (ITER it_b = set_b.begin(); it_b != set_b.end(); ++it_b)
for (ITER it_c = set_c.begin(); it_c != set_c.end(); ++it_c)
for (ITER it_d = set_d.begin(); it_d != set_d.end(); ++it_d)
for (ITER it_e = set_e.begin(); it_e != set_e.end(); ++it_e)
{
if (*it_a == true) //A参加 则B参加
if (!(*it_b == true)) continue;
if ((!*it_b || !*it_c) == false) //B...C...
continue;
if (*it_c != *it_d) //C...D...
continue;
if ((!*it_d && !*it_e) == true) //D...E....
continue;
if (*it_e == true) //E...A....D.....
if ( *it_a != true || *it_d != true) continue;
std::cout << static_cast<string>(*it_a ? "A参加." : "A不参加.") << std::endl
<< static_cast<string>(*it_b ? "B参加." : "B不参加.") << std::endl
<< static_cast<string>(*it_c ? "C参加." : "C不参加.") << std::endl
<< static_cast<string>(*it_d ? "D参加." : "D不参加.") << std::endl
<< static_cast<string>(*it_e ? "E参加." : "E不参加.") << std::endl;
_nCount++;
}
}
结果同样为 A不参加, B不参加, C参加, D参加, E不参加
祝顺利!
原题附上:
A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
人参加了竞赛:
(1)A参加时,B也参加;
(2)B和C只有一个人参加;
(3)C和D或者都参加,或者都不参加;
(4)D和E中至少有一个人参加;
(5)如果E参加,那么A和D也都参加。