//做了第一题。
/******************************************
*
* Copyright by NJU_SE_SirX
* 2006.2.15
******************************************/
#include <iostream>
using namespace std;
class Person {
public:
bool tellLie;
bool doGood;
Person(bool tl=false,bool dg=false) :tellLie(tl),doGood(dg) {}
void reset() {
tellLie=false;
doGood=false;
}
virtual void say(Person *psn,bool isTrue)=0;
};
class PersonA :public Person {
public:
void say(Person *psn,bool isTrue) {
tellLie=!isTrue;
//doGood=false;默认为false
if(tellLie) doGood=true;
}
};
class PersonBC :public Person {
public:
void say(Person *psn,bool isTrue) {
tellLie=!isTrue;
//doGood=false;默认为false
if(isTrue) psn->doGood=true;
}
};
class PersonD :public Person {
public:
void say(Person *psn,bool isTrue) {
tellLie=!isTrue;
//doGood=false;默认为false
if(isTrue) psn->tellLie=true;
}
};
//End Class
PersonA *a;
PersonBC *b;
PersonBC *c;
PersonD *d;
bool checkOK() {
int sum=0; //if OK:(the sum of doGood person) + (the sum of tellLie person) == 2
if(a->doGood) sum++;
if(b->doGood) sum++;
if(c->doGood) sum++;
if(d->doGood) sum++;
if(a->tellLie) sum++;
if(b->tellLie) sum++;
if(c->tellLie) sum++;
if(d->tellLie) sum++;
if(sum!=2) return false;
return true;
}
void prtMsg() {
char name;
if(a->doGood) name='A';
else if(b->doGood) name='B';
else if(c->doGood) name='C';
else name='D';
cout<<name<<" 做了好事。"<<endl;
}
int main() {
//分析可知B、C矛盾,必有1人说谎,所以要么B说谎,要么是C
//if B tell lies
a=new PersonA;
b=new PersonBC;
c=new PersonBC;
d=new PersonD;
a->say(a,true);
b->say(c,false);
c->say(d,true);
d->say(c,true);
if(checkOK()) {
prtMsg();
return 0;
}
//else C tell lies
//reset
a->reset();
b->reset();
c->reset();
d->reset();
a->say(a,true);
b->say(c,true);
c->say(d,false);
d->say(c,true);
prtMsg();
delete a,b,c,d;
return 0;
}
//第一道
#include <iostream.h>
bool DoGood[4];
bool a[4];
void A(void){
DoGood[0]=false;
}
void B(void){
DoGood[0]=false;
DoGood[1]=false;
DoGood[2]=true;
DoGood[3]=false;
}
void C(void){
DoGood[0]=false;
DoGood[1]=false;
DoGood[2]=false;
DoGood[3]=true;
}
void D(void){
DoGood[3]=false;
}
int main(void)
{
for(int i=0;i<4;++i){
for(int j=0;j<4;++j)
a[j]=true;
a[i]=false;
if(a[0])A();
if(a[1])B();
if(a[2])C();
if(a[3])D();
for(int i=0;i<4;++i)
cout<<a[i]<<"\t"<<DoGood[i]<<endl;
cout<<endl;
}
}
上面的写得不好 不好意思 我改了改
#include <iostream.h>
bool DoGood[4];
bool a[4];
void A(void){
DoGood[0]=false;
}
void B(void){
DoGood[0]=false;
DoGood[1]=false;
DoGood[2]=true;
DoGood[3]=false;
}
void C(void){
DoGood[0]=false;
DoGood[1]=false;
DoGood[2]=false;
DoGood[3]=true;
}
void D(void){
DoGood[3]=false;
}
int main(void)
{
for(int i=0;i<4;++i){
for(int j=0;j<4;++j)
a[j]=true;
a[i]=false;
if(a[1])
a[2]=false;
else
a[2]=true;
if(a[0])A();
if(a[1])B();
if(a[2])C();
if(a[3])D();
for(int i=0;i<4;++i)
if(a[1]+a[2]+a[3]+a[0]==3&&DoGood[1]+DoGood[2]+DoGood[3]+DoGood[0]==1)
cout<<a[i]<<"\t"<<DoGood[i]<<endl;
}
}