#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;

}

    1. ```
      ``````
      `````````
      ````````````
      

0 comments

No comments so far...