20pts,求调
查看原帖
20pts,求调
736237
codingwen楼主2023/9/9 14:19
#include<bits/stdc++.h>
using namespace std;
map<string,int> d,g;
string rg[110];
int st[110]; 
string says[110];
int lie[25];
int is_true(int u,int prison,int day){
	string s=says[u];
	if(s=="I am guilty."){
		if(prison==st[u])return 1;
		else return 0;
	}
	if(s=="I am not guilty."){
		if(prison==st[u])return 0;
		else return 1;
	}
	int blame=s.find("is guilty.");
	if(blame!=-1){
		string beblame=s.substr(0,blame-1);
		if(g[beblame]){
			if(prison==g[beblame])return 1;
			else return 0;
		} 
	}
	int defend=s.find("is not guilty.");
	if(defend!=-1){
		string bedefend=s.substr(0,defend-1);
		if(g[bedefend]){
			if(prison==g[bedefend])return 0;
			else return 1;
		} 
	}
	int date=s.find("Today is");
	if(date!=-1){
		string dating=s.substr(date+9);
		if(d[dating]){
			if(d[dating]==day)return 1;
			else return 0;
		}
	}
	return -1;
}
int main(){
	d["Monday."]=1;
	d["Tuesday."]=2;
	d["Wednesday."]=3;
	d["Thursday."]=4;
	d["Friday."]=5;
	d["Saturday."]=6;
	d["Sunday."]=7;
	int n,m,p;
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		g[s]=i;
		rg[i]=s;
	}
	string s;
	getline(cin,s);
	for(int i=1;i<=p;i++){
		getline(cin,s);
		while(s[s.length()-1]=='\r' || s[s.length()-1]=='\n'){
		    s[s.length()-1]=0;
		}
		string name=s.substr(0,s.find(":"));
		st[i]=g[name];
		string say=s.substr(s.find(":")+2);
		says[i]=say;
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=7;j++){
			memset(lie,-1,sizeof(lie));
			for(int k=1;k<=p;k++){
				int res=is_true(k,i,j);
				if(res==-1)continue;
				if(res==0)lie[k]=0;
				if(res==1)lie[k]=1;
			}
			int cnt=0;
			for(int k=1;k<=n;k++){
				if(lie[k]==0)cnt++;
			}
			if(cnt==m){
				if(ans && ans!=i){
					puts("Cannot Determine");
					return 0;
				}else ans=i;
			}
		}
	}
	if(ans==0)puts("Impossible");
	else cout<<rg[ans];
	return 0;
} 
2023/9/9 14:19
加载中...