mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
217 lines
5.0 KiB
C++
217 lines
5.0 KiB
C++
|
#include<iostream>
|
||
|
#include<string.h>
|
||
|
using namespace std;
|
||
|
#define N 55
|
||
|
#define M 10
|
||
|
int people[M];
|
||
|
int brith[M];
|
||
|
int n;
|
||
|
int ok;
|
||
|
int FP;
|
||
|
int now[M];
|
||
|
int yes[M];
|
||
|
struct say{
|
||
|
char talk;
|
||
|
char name;
|
||
|
int bo;
|
||
|
int sex;
|
||
|
};
|
||
|
void thesome()
|
||
|
{
|
||
|
for(int i = 0; i < 6; i++)
|
||
|
if(now[i] != people[i])
|
||
|
yes[i] = 1;
|
||
|
}
|
||
|
int ture_say(say f)
|
||
|
{
|
||
|
if(f.sex != -1)
|
||
|
{
|
||
|
if(f.name == 'T')
|
||
|
{
|
||
|
if(f.bo && f.sex - 4 == people[0])
|
||
|
return 1;
|
||
|
else if(!f.bo && f.sex - 4 != people[0])
|
||
|
return 1;
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int id = f.name - 'A' + 1;
|
||
|
if(f.bo && f.sex == people[id])
|
||
|
return 1;
|
||
|
else if(!f.bo && f.sex != people[id])
|
||
|
return 1;
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int id = f.name - 'A' + 1;
|
||
|
if(people[id] == 3 && !f.bo)
|
||
|
return 1;
|
||
|
else if (people[id] == 1 && f.bo)
|
||
|
return 1;
|
||
|
else if(people[id] == 2)
|
||
|
{
|
||
|
if(people[0] && !f.bo)
|
||
|
return 1;
|
||
|
else if(!people[0] && f.bo)
|
||
|
return 1;
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
int write(char str[])
|
||
|
{
|
||
|
if(strncmp(str, "divine.", 7) == 0)
|
||
|
return 3;
|
||
|
else if(strncmp(str, "human.", 6) == 0)
|
||
|
return 2;
|
||
|
else if(strncmp(str, "evil.", 5) == 0)
|
||
|
return 1;
|
||
|
else if(strncmp(str, "day.", 4) == 0)
|
||
|
return 5;
|
||
|
else if( strncmp(str, "night.", 6) == 0)
|
||
|
return 4;
|
||
|
else if( strncmp(str, "lying.", 6) ==0)
|
||
|
return -1;
|
||
|
}
|
||
|
void read(say tem[])
|
||
|
{
|
||
|
char str[M];
|
||
|
int id;
|
||
|
for(int i = 0; i < n; i++)
|
||
|
{
|
||
|
cin >> str;
|
||
|
tem[i].talk = str[0];
|
||
|
id = str[0] - 'A' + 1;
|
||
|
brith[id] = 1;
|
||
|
cin >> str;
|
||
|
if(strcmp(str, "It") == 0)
|
||
|
tem[i].name = 'T';
|
||
|
else if(str[0] == 'I')
|
||
|
tem[i].name = tem[i].talk;
|
||
|
else
|
||
|
{
|
||
|
tem[i].name = str[0];
|
||
|
id = str[0] - 'A' + 1;
|
||
|
brith[id] = 1;
|
||
|
}
|
||
|
cin >> str;
|
||
|
cin >> str;
|
||
|
if(strcmp(str, "not"))
|
||
|
{
|
||
|
tem[i].bo = 1;
|
||
|
tem[i].sex = write(str);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
tem[i].bo = 0;
|
||
|
cin >> str;
|
||
|
tem[i].sex = write(str);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
int judge(say tem[])
|
||
|
{
|
||
|
for(int i = 0; i < n; i++)
|
||
|
{
|
||
|
int id = tem[i].talk - 'A' + 1;
|
||
|
if(people[id] == 3)
|
||
|
{
|
||
|
if(ture_say(tem[i]))
|
||
|
continue;
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
else if(people[id] == 2)
|
||
|
{
|
||
|
int f = ture_say(tem[i]);
|
||
|
if( (people[0] && f) || (!people[0] && !f) )
|
||
|
continue;
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
else if(people[id] == 1)
|
||
|
{
|
||
|
if(!ture_say(tem[i]))
|
||
|
continue;
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
void build(int k, say tem[])
|
||
|
{
|
||
|
if(k < 6)
|
||
|
{
|
||
|
if(brith[k])
|
||
|
{
|
||
|
for(people[k] = 1; people[k] < 4; people[k]++)
|
||
|
build(k + 1, tem);
|
||
|
}
|
||
|
else
|
||
|
build(k + 1, tem);
|
||
|
}
|
||
|
else if(judge(tem))
|
||
|
{
|
||
|
if(ok >= 1)
|
||
|
thesome();
|
||
|
else
|
||
|
for(int i = 0; i < 6; i++)
|
||
|
now[i] = people[i];
|
||
|
ok++;
|
||
|
}
|
||
|
}
|
||
|
int main()
|
||
|
{
|
||
|
int t = 1;
|
||
|
while(cin >> n, n)
|
||
|
{
|
||
|
memset(people, 0, sizeof(people));
|
||
|
memset(brith, 0, sizeof(brith));
|
||
|
ok = 0;
|
||
|
say tem[N];
|
||
|
memset(yes, 0,sizeof(yes));
|
||
|
read(tem);
|
||
|
cout << "Conversation #" << t++ << endl;
|
||
|
for(people[0] = 0; people[0] < 2; people[0]++)
|
||
|
build(1, tem);
|
||
|
if(ok == 0)
|
||
|
cout << "This is impossible." << endl;
|
||
|
else
|
||
|
{
|
||
|
//*
|
||
|
int oi = 0;
|
||
|
for(int i = 1; i < 6; i++)
|
||
|
{
|
||
|
if(!yes[i] && now[i])
|
||
|
{
|
||
|
oi++;
|
||
|
char c = 'A' + i - 1;
|
||
|
if(now[i] == 3)
|
||
|
cout << c << " is divine." << endl;
|
||
|
else if(now[i] == 2)
|
||
|
cout << c << " is human." << endl;
|
||
|
else if(now[i] == 1)
|
||
|
cout << c << " is evil." << endl;
|
||
|
}
|
||
|
}
|
||
|
if(oi == 0 && yes[0])
|
||
|
cout << "No facts are deducible." << endl;
|
||
|
if(now[0] && !yes[0])
|
||
|
cout << "It is day." << endl;
|
||
|
else if(!yes[0])
|
||
|
cout << "It is night." << endl;
|
||
|
}
|
||
|
cout << endl;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|