这道题是一道有技术含量的模拟,我们主要是不要让计算机向人一样思考,只需要让他穷举变化的星期几和当罪犯的人的编号即可,然后就是用string来操作会显得十分方便
#include<iostream> #include<cstring> #include<string> #include<cstdio> using namespace std; int n,m,p,fake[21],err,w[200],nx; string name[100],say[200]; string day[10]={"QAQ","Today is Sunday.","Today is Monday.","Today is Tuesday.","Today is Wednesday.","Today is Thursday.","Today is Friday.","Today is Saturday."}; void set(int who,int yx) { if(fake[who]&&fake[who]!=yx)err=1; else fake[who]=yx; } int main() { scanf("%d%d%d",&m,&n,&p); for(int i=1;i<=m;i++) cin>>name[i]; for(int i=1;i<=p;i++) { string nm; cin>>nm; nm.erase(nm.end()-1); for(int j=1;j<=m;j++) if(name[j]==nm) w[i]=j; getline(cin,say[i]); say[i].erase(say[i].begin()); say[i].erase(say[i].end()-1); } for(int td=1;td<=7;td++) for(int px=1;px<=m;px++) { err=0; memset(fake,0,sizeof(fake)); for(int i=1;i<=p;i++) { int who=w[i]; if(say[i]=="I am guilty.")set(who,px==who?1:-1); if(say[i]=="I am not guilty.")set(who,px!=who?1:-1); for(int j=1;j<=7;j++) if(say[i]==day[j])set(who,j==td?1:-1); for(int j=1;j<=m;j++) { if(say[i]==name[j]+" is guilty.")set(who,j==px?1:-1); if(say[i]==name[j]+" is not guilty.")set(who,j!=px?1:-1); } } int cnt=0,ppp=0; for(int i=1;i<=m;i++) { if(fake[i]==-1)cnt++; if(fake[i]==0)ppp++; } if(!err&&cnt<=n&&cnt+ppp>=n) if(nx&&nx!=px) { printf("Cannot Determine"); return 0; } else nx=px; } if(!nx)printf("Impossible"); else cout<<name[nx]; return 0; }完结撒花~
转载于:https://www.cnblogs.com/vercont/p/10210067.html
相关资源:JAVA上百实例源码以及开源项目