- ACM
凶手是我
- 2024-5-30 21:17:52 @
#include #include #include #include #include <string.h> using namespace std; const int max_m = 20;
int m, n, p; map<string, int>name2index;//name to index struct sent { int info[2]; }; vectorsents[max_m + 1];//index to sentences map<string, int>week2index;//week to index int states[max_m + 1];
void get_sent(int index) { string s; sent sentence;
getline(cin, s);//读入句子
for (map<string, int>::iterator it = week2index.begin(); it != week2index.end(); it++) {//日期类型
if (s.find(it->first) != -1) {
sentence.info[0] = 0;
sentence.info[1] = it->second;
sents[index].push_back(sentence);
return;
}
}
if (s.find("I am guilty.") != -1) {//罪人指定一
sentence.info[0] = index;
sentence.info[1] = 1;
sents[index].push_back(sentence);
return;
}
else if (s.find("I am not guilty.") != -1) {
sentence.info[0] = index;
sentence.info[1] = 0;
sents[index].push_back(sentence);
return;
}
int ret, ret2;
if ((ret = s.find(" is guilty.")) != -1) {//罪人指定二
ret2 = s.rfind(' ', ret - 1);
sentence.info[0] = name2index[s.substr(ret2 + 1, ret - 1)];
sentence.info[1] = 1;
sents[index].push_back(sentence);
return;
}
else if ((ret = s.find(" is not guilty.")) != -1) {
ret2 = s.rfind(' ', ret - 1);
sentence.info[0] = name2index[s.substr(ret2 + 1, ret - 1)];
sentence.info[1] = 0;
sents[index].push_back(sentence);
return;
}
}
void init_week() { week2index.insert(pair<string, int>("Today is Monday.", 1)); week2index.insert(pair<string, int>("Today is Tuesday.", 2)); week2index.insert(pair<string, int>("Today is Wednesday.", 3)); week2index.insert(pair<string, int>("Today is Thursday.", 4)); week2index.insert(pair<string, int>("Today is Friday.", 5)); week2index.insert(pair<string, int>("Today is Saturday.", 6)); week2index.insert(pair<string, int>("Today is Sunday.", 7)); }
int main() { init_week(); cin >> m >> n >> p; string name; for (int i = 1; i <= m; i++) { cin >> name; name2index.insert(pair<string, int>(name, i)); } for (int i = 1; i <= p; i++) { cin >> name; name = name.substr(0, name.size() - 1); get_sent(name2index[name]); }
int cnt = 0, cnt2 = 0, find = 0;
bool end_index = false;
for (int guilty = 1; guilty <= m; guilty++) {//假设罪犯
for (int day = 1; day <= 7; day++) {//假设日期
cnt = 0;//说假话的人数
cnt2 = 0;//说真话的人数
memset(states + 1, -1, sizeof(int) * max_m);//初始化未知身份
end_index = false;//开始推断
for (int i = 1; i <= m && !end_index; i++) {//遍历每一个人
for (int j = 0; j < int(sents[i].size()); j++) {//遍历这个人说过的话
if (sents[i][j].info[0]) {//关于人
if (sents[i][j].info[1]) {//xx是罪犯
if (guilty != sents[i][j].info[0]) {//假话
if (states[i] != -1) {//身份已知
if (states[i] != 0) {
end_index = true;//与已知矛盾,假设错误,本轮推断结束
break;
}
}
else {//身份未知
states[i] = 0;//标记说假话的身份
cnt++;//说假话人数++
}
}
else {//真话
if (states[i] != -1) {//身份已知
if (states[i] != 1) {
end_index = true;//与已知矛盾,假设错误,本轮推断结束
break;
}
}
else {//身份未知
states[i] = 1;//标记说真话身份
cnt2++;//说真话的人++
}
}
}
else {//xx不是罪犯
if (guilty == sents[i][j].info[0]) {//假话
if (states[i] != -1) {//身份已知
if (states[i] != 0) {
end_index = true;//与已知矛盾,假设错误,本轮推断结束
break;
}
}
else {//身份未知
states[i] = 0;//标记说假话的身份
cnt++;//说假话人数++
}
}
else {//真话
if (states[i] != -1) {//身份已知
if (states[i] != 1) {
end_index = true;//与已知矛盾,假设错误,本轮推断结束
break;
}
}
else {//身份未知
states[i] = 1;//标记说真话的身份
cnt2++;//说真话的人++
}
}
}
}
else {//关于日期
if (day != sents[i][j].info[1]) {//假话
if (states[i] != -1) {//身份已知
if (states[i] != 0) {
end_index = true;//与已知矛盾,假设错误,本轮推断结束
break;
}
}
else {//身份未知
states[i] = 0;//标记说假话的身份
cnt++;//说假话人数++
}
}
else {//真话
if (states[i] != -1) {//身份已知
if (states[i] != 1) {
end_index = true;//与已知矛盾,假设错误,本轮推断结束
break;
}
}
else {//身份未知
states[i] = 1;//标记说真话的身份
cnt2++;//说真话的人++
}
}
}
}
}//一轮推断完成
if (cnt <= n && cnt2 <= m - n && !end_index) {//推断出凶手
if (find == 0)
find = guilty;
else if (find != guilty) {//推断出多个凶手
cout << "Cannot Determine" << endl;
return 0;
}
}
}
}
//结论
if (find) {
for (map<string, int>::iterator it = name2index.begin(); it != name2index.end(); it++) {
if (it->second == find) {
cout << it->first << endl;
}
}
}
else cout << "Impossible" << endl;//未推断出凶手
return 0;
}
-
-
``` `````` ````````` ````````````
-