思路:枚举罪犯是哪一个人,再枚举今天是星期几。用数组 fi,j 表示第 i 个人说第 j 个人是不是罪犯。1 表示是,−1 表示不是,0 表示未知。然后再存下来每个人说今天是星期几。结果 70pts。
到底是为什么?
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,p,cnt;
map<string,int> nam;
string nam2[33];
string word[550][550];
int change(string w)
{
if(w=="MONDAY.")return 1;
if(w=="TUESDAY.")return 2;
if(w=="WEDNESDAY.")return 3;
if(w=="THURSDAY.")return 4;
if(w=="FRIDAY.")return 5;
if(w=="SATURDAY.")return 6;
if(w=="SUNDAY.")return 7;
}
vector<int> f[22][22];
vector<int> we[22];
string ans;
int ccnt=0;
main()
{
cin>>n>>m>>p;
for(int i=1;i<=n;i++)
{
string tt;
cin>>tt;
nam[tt+":"]=i;
nam2[i]=tt;
}
for(int c=1;c<=p;c++)
{
string tmp;
for(int i=1;;i++)
{
cin>>tmp;
word[c][i]=tmp;
if(i==i)
{
for(int j=0;j<word[c][i].length();j++)
{
if(word[c][i][j]>='a'&&word[c][i][j]<='z')word[c][i][j]-=('a'-'A');
}
}
if(tmp[tmp.length()-1]=='.'||tmp[tmp.length()-1]=='?'||tmp[tmp.length()-1]=='!')break;
}
if(word[c][2]=="I"&&word[c][3]=="AM"&&word[c][4]=="GUILTY.")f[nam[word[c][1]]][nam[word[c][1]]].push_back(1);
if(word[c][2]=="I"&&word[c][3]=="AM"&&word[c][4]=="NOT"&&word[c][5]=="GUILTY.")f[nam[word[c][1]]][nam[word[c][1]]].push_back(-1);
if(word[c][3]=="IS"&&word[c][4]=="GUILTY.")f[nam[word[c][1]]][nam[word[c][2]+":"]].push_back(1);
if(word[c][3]=="IS"&&word[c][4]=="NOT"&&word[c][5]=="GUILTY.")f[nam[word[c][1]]][nam[word[c][2]+":"]].push_back(-1);
if(word[c][2]=="TODAY"&&word[c][3]=="IS")we[nam[word[c][1]]].push_back(change(word[c][4]));
}
if(n==1&&f[1][1].size()==0)return cout<<nam2[1],0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=7;j++)
{
int flag[30]={0},okay=1,lier=0;//1 lier;2 honester
for(int x=1;x<=n&&okay;x++)
{
for(int y=1;y<=n&&okay;y++)
{
for(int k=0;k<f[x][y].size()&&okay;k++)
{
if(flag[x]==1)
{
if((y==i&&f[x][y][k]==1)||(y!=i&&f[x][y][k]==-1))okay=0;
}
if(flag[x]==2)
{
if((y==i&&f[x][y][k]==-1)||(y!=i&&f[x][y][k]==1))okay=0;
}
if(flag[x]==0)
{
if((y==i&&f[x][y][k]==1)||(y!=i&&f[x][y][k]==-1))
{
flag[x]=2;
}
else
{
flag[x]=1;
lier++;
}
}
}
}
}
for(int x=1;x<=n;x++)
{
for(int k=0;k<we[x].size()&&okay;k++)
{
if(flag[x]==1)
{
if(we[x][k]==j)okay=0;
}
if(flag[x]==2)
{
if(we[x][k]!=j)okay=0;
}
if(flag[x]==0)
{
if(we[x][k]==j)
{
flag[x]=2;
}
else
{
flag[x]=1;
lier++;
}
}
}
}
if(!okay)continue;
if(lier==m)
{
if(ccnt!=0)return cout<<"Cannot Determine",0;
ccnt++;
ans=nam2[i];
}
}
}
if(ccnt==0)
puts("Impossible");
else cout<<ans;
}
感谢各位神犇!