P1039侦探推理(我这代码咋有问题啊)
查看原帖
P1039侦探推理(我这代码咋有问题啊)
211960
nzynzy楼主2021/9/5 10:59
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
pair<int,string> sentence[130];
string name[25];
int n,m,p,state[130];
string week[7] = {
    "Today is Monday.",
    "Today is Tuesday.",
    "Today is Wednesday.",
    "Today is Thursday.",
    "Today is Friday.",
    "Today is Saturday.",
    "Today is Sunday."};
int get_id(string str){
	for(int i=0;i<m;i++)if(str==name[i])return i;
	return -1;
}
int judge(int day,int killer,int now,string str){//1假话,0真话 
	if(str=="I am guilty.")return killer!=now;
	if(str=="I am not guilty.")return killer==now;
	for(int i=0;i<7;i++)
		if(str==week[i])return day!=i;
	for(int i=0;i<m;i++)if(name[i]+" is guilty."==str)return killer!=i;
	for(int i=0;i<m;i++)if(name[i]+" is not guilty."==str)return killer==i;
	return -1;
}
bool check(int x,int y){//人,日期 
	memset(state,-1,sizeof state);
	for(int i=0;i<p;i++){
	pair<int,string> sen=sentence[i];
	int st=judge(x,y,sen.first,sen.second),t=sen.first;
	if(st==1){
		if(state[t]==0)return false;
		else if(state[t]==-1)state[t]=1;
	}else if(st==0){
		if(state[t]==1)return false;
		else if(state[t]==-1)state[t]=0;
	}
	}
	int fake=0,other=0;
	for(int i=0;i<m;i++){
		if(state[i]==1)fake++;
		if(state[i]==-1)other++;
	}
	return fake<=n&&fake+other>=n;
}
int main(){
	cin>>m>>n>>p;
	for(int i=0;i<m;i++)cin>>name[i];
	for(int i=0;i<p;i++){
		string s,t;
		cin>>t;
		t.erase(t.length()-1);
		getline(cin,s);
		s.erase(s.begin());
		sentence[i]=make_pair(get_id(t),s);
	}
	int cnt=0,p=-1;
	for(int i=0;i<7;i++){
		cnt=0;
		for(int j=0;j<m;j++){
			if(check(i,j)){
				p=j;
				cnt++;
			}
			if(cnt>1){
				cout<<"Cannot Determine";
				break;
			}
		}
	}
	if(cnt<=1){
		if(p==-1)cout<<"Impossible";
		else cout<<name[p];
	}
	return 0;
}
2021/9/5 10:59
加载中...