P1039 求助
查看原帖
P1039 求助
489257
Mirage_Insane楼主2023/2/3 14:38
#include<iostream>
#include<cstdio>
#include<cmath>
#include<climits>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
#define SF scanf
#define PF printf
int n, m, p, len_r_g1, len_r_g2, len_r_day, len_f_day, len_now_g1, len;
bool vis[105];
string re_g1[105], re_g2[105], re_day[105], fa_day[105], now_g1[105], Fal[105];
struct node {
	string g1[105], g2[105], day[105];
	int leng1, leng2, lenday;
	node () {leng1 = leng2 = lenday = 0;}
	//g1:他认为的罪犯
	//g2:他不认为的罪犯
	//day:字面意思 
	//leng1、leng2、lenday:字面意思 
};
map<string, node> mp;
map<string, bool> vis1, Re_g1, Re_g2, Re_day, Fa_day;
string name[25];
bool getday(string s) {
	if(s == "Monday." || s == "Tuesday." || s == "Wednesday." || s == "Thursday." || s == "Friday." || s == "Saturday." || s == "Sunday.") return true;
	return false;
}
bool check(string s) {
	int lens = s.length(), sum = 0;
	for(int i = 0; i < lens; i++) {
		if(s[i] == ' ') sum++;
	}
	return sum == 3 || sum == 4;
}
bool Check() {
	Re_g1.clear(), Re_g2.clear(), Re_day.clear(), Fa_day.clear();
	len_r_g1 = len_r_g2 = len_r_day = len_f_day = 0;
	int now_f = 1;
	for(int i = 1; i <= m; i++) {
		for(int j = 1; j <= mp[name[i]].leng1; j++) {
			if(name[i] != Fal[now_f]) {
				if(!Re_g1[mp[name[i]].g1[j]]) {
					Re_g1[mp[name[i]].g1[j]] = 1;
					re_g1[++len_r_g1] = mp[name[i]].g1[j];
				}
			}
			else {
				if(!Re_g2[mp[name[i]].g1[j]]) {
					Re_g2[mp[name[i]].g1[j]] = 1;
					re_g2[++len_r_g2] = mp[name[i]].g1[j];
				}
			}
		}
		for(int j = 1; j <= mp[name[i]].leng2; j++) {
			if(name[i] != Fal[now_f]) {
				if(!Re_g2[mp[name[i]].g2[j]]) {
					Re_g2[mp[name[i]].g2[j]] = 1;
					re_g2[++len_r_g2] = mp[name[i]].g2[j];
				}
			}
			else {
				if(!Re_g1[mp[name[i]].g2[j]]) {
					Re_g1[mp[name[i]].g2[j]] = 1;
					re_g1[++len_r_g1] = mp[name[i]].g2[j];
				}
			}
		}
		for(int j = 1; j <= mp[name[i]].lenday; j++) {
			if(name[i] != Fal[now_f]) {
				if(!Re_day[mp[name[i]].day[j]]) {
					Re_day[mp[name[i]].day[j]] = 1;
					re_day[++len_r_day] = mp[name[i]].day[j];
				}
			}
			else {
				if(!Fa_day[mp[name[i]].day[j]]) {
					Fa_day[mp[name[i]].day[j]] = 1;
					fa_day[++len_f_day] = mp[name[i]].day[j];
				}
			}
		}
		if(name[i] == Fal[now_f]) now_f++;
	}
	if(len_r_g1 != 1 || len_r_day > 1) return false;
	string guilty = re_g1[1];
	for(int i = 1; i <= len_r_g2; i++) {
		if(re_g2[i] == guilty) return false;
	}
	if(len_r_day == 1) {
		string Today = re_day[1];
		for(int i = 1; i <= len_f_day; i++) {
			if(fa_day[i] == Today) return false;
		}
	}
	return true;
}
void dfs(int id, int now, int last) {
	if(now == n) {
		bool flag = Check();
		if(flag) now_g1[++len_now_g1] = re_g1[1];
		return;
	}
	if(id > m) return;
	for(int i = last + 1; i <= m; i++) {
		if(!vis[i]) {
			vis[i] = 1;
			Fal[++len] = name[i];
			dfs(id + 1, now + 1, i);
			len--;
			vis[i] = 0;
		}
	}
}
int main() {
//	freopen("detective.in", "r", stdin);
//	freopen("detective.out", "w", stdout);
	ios :: sync_with_stdio(false);
	cin >> m >> n >> p;
	for(int i = 1; i <= m; i++) cin >> name[i], vis1[name[i]] = 1;
	for(int i = 0; i <= p; i++) {
		string a = "", b = "", c = "", d = "", e = "", x;
		bool flaga = 0, flagb = 0, flagc = 0, flagd = 0, flage = 0;
		getline(cin, x);
		if(!check(x)) continue;
		int lenx = x.length();
		for(int j = 0; j < lenx; j++) {
			if(x[j] == ' ') {
				if(!flaga) flaga = 1;
				else if(!flagb) flagb = 1;
				else if(!flagc) flagc = 1;
				else if(!flagd) flagd = 1;
				else flage = 1;
				continue;
			}
			if(!flaga) a = a + x[j];
			else if(!flagb) b = b + x[j];
			else if(!flagc) c = c + x[j];
			else if(!flagd) d = d + x[j];
			else e = e + x[j]; 
		}
		for(int j = 1; j <= m; j++) {
			if(a == name[j] + ":") {
				if(b == "Today" && c == "is" && getday(d)) mp[name[j]].day[++mp[name[j]].lenday] = d;
				else if(b == "I" && c == "am" && d == "not") {
					if(e == "guilty.") mp[name[j]].g2[++mp[name[j]].leng2] = name[j];
				}
				else if(b == "I" && c == "am" && d == "guilty.") mp[name[j]].g1[++mp[name[j]].leng1] = name[j];
				else if(vis1[b] && c == "is" && d == "not") {
					if(e == "guilty.") mp[name[j]].g2[++mp[name[j]].leng2] = b;
				}
				else if(vis1[b] && c == "is" && d == "guilty.") mp[name[j]].g1[++mp[name[j]].leng1] = b;
			}
		}
	}
	dfs(1, 0, 0);
	if(len_now_g1 == 0) cout << "Impossible";
	else if(len_now_g1 == 1) cout << now_g1[len_now_g1];
	else cout << "Cannot Determine";
	return 0;
}
/*
4 2 5
MIKE
BOB
ALICE
AMY
MIKE: I am guilty.
MIKE: AMY is guilty.
BOB: I am guilty.
ALICE: MIKE is guilty.
AMY: I am not guilty.
*/

今天考试遇到了这题,赛时代码,拿了50pts。

也许有错误,但这并不是楼主想要知道的。

刚刚交洛谷,WA了第一个点,但本地上运行没错。

个人感觉是输入或者输出有了奇怪的错误。

求助。

洛谷第一个点如下:

inputinput

2 2 4
HELLO
GUILTY
HELLO: What is your name?
GUILTY: I am GUILTY.
GUILTY: Are you guilty?
HELLO: I am not guilty.

outputoutput

HELLO
2023/2/3 14:38
加载中...