題目描述
明明同學最近迷上了偵探漫畫《柯南》並沉醉於推理遊戲之中,於是他召集了一群同學玩推理遊戲。遊戲的內容是這樣的,明明的同學們先商量好由其中的乙個人充當罪犯(在明明不知情的情況下),明明的任務就是找出這個罪犯。接著,明明逐個詢問每乙個同學,被詢問者可能會說:
證詞中出現的其他話,都不列入邏輯推理的內容。
明明所知道的是,他的同學中有n個人始終說假話,其餘的人始終說真。
現在,明明需要你幫助他從他同學的話中推斷出誰是真正的**,請記住,**只有乙個!
輸入輸出格式
輸入格式:
輸入由若干行組成,第一行有二個整數,m(1≤m≤20)、n(1≤n≤m)和p(1≤p≤100);m是參加遊戲的明明的同學數,n是其中始終說謊的人數,p是證言的總數。接下來m行,
每行是明明的乙個同學的名字(英文本母組成,沒有主格,全部大寫)。
往後有p行,每行開始是某個同學的名宇,緊跟著乙個冒號和乙個空格,後面是一句證詞,符合前表中所列格式。證詞每行不會超過250個字元。
輸入中不會出現連續的兩個空格,而且每行開頭和結尾也沒有空格。
輸出格式:
如果你的程式能確定誰是罪犯,則輸出他的名字;如果程式判斷出不止乙個人可能是罪犯,則輸出 cannot determine;如果程式判斷出沒有人可能成為罪犯,則輸出 impossible。
輸入輸出樣例
輸入樣例#1:
3 1 5
mike
charles
kate
mike: i am guilty.
mike: today is sunday.
charles: mike is guilty.
kate: i am guilty.
kate: how are you??
輸出樣例#1:
mike
對於每個人,記錄他認為的**,非**,和今天的星期。
列舉**,星期。
模擬即可。
注意linux中不能用gets,getline,所以判斷行末可以判斷標點。
#include
#include
#include
#include
using
namespace
std;
int n,m,p,sit[205];
string name[25];
mapren,weekday;
string sent=;
struct person
a[25];
int main()
weekday["monday."]=1;
weekday["tuesday."]=2;
weekday["wednesday."]=3;
weekday["thursday."]=4;
weekday["friday."]=5;
weekday["saturday."]=6;
weekday["sunday."]=7;
while(p--)
for(int j=1;j<=5;j++)}}
for(int i=1;i<=m;i++)//**
else
if(!flag)
for(int g=1;g<=a[k].fou[0];g++)
if(a[k].fou[g]==i)
else
if(!flag)
for(int g=1;g<=a[k].ri[0];g++)
if(a[k].ri[g]==j)
else
if(!flag)
}if(!flag)
}if(pd)
sit[++sit[0]]=i;
}if(sit[0]==0)
printf("impossible\n");
else
if(sit[0]==1)
cout
<1]]
printf("cannot determine\n");
return
0;}
洛谷 P1039 偵探推理
這道題是一道有技術含量的模擬,我們主要是不要讓計算機向人一樣思考,只需要讓他窮舉變化的星期幾和當罪犯的人的編號即可,然後就是用string來操作會顯得十分方便 include include include includeusing namespace std int n,m,p,fake 21 e...
洛谷 P1039 偵探推理
這道題是一道有技術含量的模擬,我們主要是不要讓計算機向人一樣思考,只需要讓他窮舉變化的星期幾和當罪犯的人的編號即可,然後就是用string來操作會顯得十分方便 include include include includeusing namespace std int n,m,p,fake 21 e...
P1039 偵探推理
include include include using namespace std int n,m,p,fake 21 err,w 200 nx string name 100 say 200 string day 10 void set int who,int yx intmain for i...