#4#6#11WA求助
查看原帖
#4#6#11WA求助
1507112
Notam楼主2024/12/8 20:33
#include <stdio.h>
#include <string.h>
int M,N,P;
char name[20][1000]={'\0'},DAY[8][11]={"","Monday.","Tuesday.","Wednesday.","Thursday.","Friday.","Saturday.","Sunday."};
short allege[20][20]={0},time[20]={0};
/*
	allege[0][1]==-1
	代表#0认为#1是凶手
	allege[1][0]==1
	#1认为#0是好人
	allege[0][0]==0
	#0没有对#0的意见
	time[0]==1
	#0认为今天是星期一
	time[1]==0
	#1没说今天星期几
*/
void alleging(char *word,char *alleger)//分析证词,并计入allege数组以及,time数组(证词,证人)
{
	short i,body;
	char mod[10000];
	word++;
	for(i=0;i<M;i++)
		if(strcmp(name[i],alleger)==0)
		{
			body=i;
			break;
		}
	if(strcmp("I am guilty.",word)==0)
	{
		allege[body][body]=-1;
		return ;
	}
	if(strcmp("I am not guilty.",word)==0)
	{
		allege[body][body]=1;
		return ;
	}
	for(i=0;i<M;i++)
	{
		strcpy(mod,name[i]);
		strcat(mod," is guilty.");
		if(strcmp(mod,word)==0)
		{
			allege[body][i]=-1;
			break;
		}
	}
	for(i=0;i<M;i++)
	{
		strcpy(mod,name[i]);
		strcat(mod," is not guilty.");
		if(strcmp(mod,word)==0)
		{
			allege[body][i]=1;
			break;
		}
	}
	for(i=1;i<=7;i++)
	{
		strcpy(mod,"Today is ");
		strcat(mod,DAY[i]);
		if(strcmp(mod,word)==0)
		{
			time[body]=i;
			break;
		}
	}
}
short liera(short body,short guilty)//通过指控判断某人是否为骗子(判断谁,假设凶手是),骗子返回-1,真话返回1,不确定返回0
{
	short i;
	for(i=0;i<guilty;i++)
		if(allege[body][i])
			return allege[body][i];
	if(allege[body][guilty])
		return -allege[body][guilty];
	for(i=guilty+1;i<M;i++)
		if(allege[body][i])
			return allege[body][i];
	return 0;
}
short turelier(short guilty)//判断骗子数量是否正确(凶手是),正确返回1,否则0
{
	short tured[8]={0},islier[20]={0},sum,msum,i,j;
	/*
		tured[x]:今天是不是星期x
		==1,是
		==-1,不是
		==0,不确定
		islier[x]:#x是不是骗子
		==1,不是
		==-1,是
		==0,不确定
		sum:至少有几个骗子
		msum:有几个可能是骗子
	*/
	for(i=0;i<M;i++)
		islier[i]=liera(i,guilty);
	for(i=0;i<M;i++)
		if(islier[i]&&time[i])
		{//通过指控分析时间
			if(islier[i]==1)
			{//星期i是对的,其他都是错的
				for(j=1;j<=7;j++)
					tured[j]=-1;
				tured[time[i]]=1;
				break;
			}
			else
				tured[time[i]]=-1;
		}
	for(i=1;i<=7;i++)
		if(tured[i]>=0)
		{//设今天星期i,判断骗子人数
			sum=0;
			msum=0;
			if(tured[i]==1)
			{//今天就是星期i
				for(j=0;j<M;j++)
					if(islier[j]==1||time[j]==i)
						sum++;
					else if(islier[j]==0&&time[j]==0)
						msum++;
				if(N>=sum&&N<=sum+msum)
					return 1;
				else
					return 0;
			}
			else
			{//今天可能是星期i
				for(j=0;j<M;j++)
					if(islier[j]==1||time[j]==i)
						sum++;
					else if(islier[j]==0&&time[j]==0)
						msum++;
				if(N>=sum&&N<=sum+msum)
					return 1;
			}
		}
	return 0;
}
int main()
{
	short i,guilty=-1,j;
	char cha[10000]={'\0'},alleger[20];
	scanf("%d%d%d",&M,&N,&P);
	N=M-N;
	for(i=0;i<M;i++)
		scanf("%s",name[i]);
	for(i=0;i<P;i++)
	{
		memset(alleger,'\0',20);
		memset(cha,'\0',10000);
		scanf("%s",alleger);
		alleger[strlen(alleger)-1]='\0'; 
		gets(cha);
		for(j=0;j<10000;j++)
			if(cha[j]=='\n'||cha[j]=='\r')
				cha[j]='\0';
		alleging(cha,alleger);
	}
	for(i=0;i<M;i++)
		if(turelier(i))
		{
			if(guilty!=-1)
			{
				printf("Cannot Determine");
				return 0;
			}
			else
				guilty=i;
		}
	if(guilty==-1)
		printf("Impossible");
	else
		printf("%s\n",name[guilty]);
	return 0;
}
2024/12/8 20:33
加载中...