`
Jianquan
  • 浏览: 19833 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

UVa 592 Island of Logic

    博客分类:
  • UVa
阅读更多
题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=533
人数最多只有5个人,加上时间,所以可以用6个循环枚举所有的情况。
输入的时候可以根据某个特定的字符去判断这个陈述的内容,比如带有'd'的是'divine'。
判断该陈述是否合法还要结合说话人的身份去判断。如果所有的陈述都合法,那么枚举的这种情况是可能的,把它保存下来,枚举完所以情况后再进行判断。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;

struct Statement
{
	char speaker,object,nature;//说话者、陈述对象、对象的性质
	bool whether;//是否
};

Statement s[60];
int res[5][4];//保存枚举的结果

void input(int num)
{
	string str1,str2;
	getline(cin,str1);
	for(int i=0;i<str1.length();i++)//把陈述的所有空格去掉
		if(str1[i]!=' ') str2+=str1[i];
	s[num].speaker=str2[0];
	if(str2[3]=='t') 
	{
		s[num].object='t';//陈述对象是时间
		if(str2[7]=='o')
		{
			s[num].whether=false;
			s[num].nature=str2[9];
		}
		else
		{
			s[num].whether=true;
			s[num].nature=str2[6];
		}
	}
	else
	{
		if(str2[2]=='I')
			s[num].object=s[num].speaker;
		else
			s[num].object=str2[2];
		if(str2[5]=='n')
		{
			s[num].whether=false;
			s[num].nature=str2[8];
		}
		else
		{
			s[num].whether=true;
			s[num].nature=str2[5];
		}
	}
}
bool judge(int _fact,int t,bool whether,char statement)//判断陈述的性质与事实是否相符
{
	char fact;
	if(_fact==1) fact='d';
	else if(_fact==2) fact='e';
	else fact='h';
	if(statement=='l'&&whether)
	{
		if(fact=='e'||fact=='h'&&t==2)//如果指证对方说谎,那么对方必须是恶魔或者晚上的人类才陈述正确
			return 1;
		else
			return 0;
	}
	if(statement=='l'&&!whether)//如果澄清对方没有说谎,那么对方必须是牧师或者白天的人类才陈述正确
	{
		if(fact=='d'||fact=='h'&&t==1)
			return 1;
		else
			return 0;
	}
	if((statement==fact)==whether)//同为真或同为假时陈述正确
		return 1;
	else
		return 0;
}	
bool islegal(int num,int A,int B,int C,int D,int E,int t)
{
	bool stateistrue;//记录陈述是否正确
	if(s[num].object=='t')//如果陈述的是时间
	{
		char time;
		if(t==1) time='d';
		else time='n';
		if((s[num].nature==time)==(s[num].whether))//同为真或同为假时陈述正确
			stateistrue=1;
		else 
			stateistrue=0;
	}
	else
	{
		switch(s[num].object)
		{
			case'A':stateistrue=judge(A,t,s[num].whether,s[num].nature);break;
			case'B':stateistrue=judge(B,t,s[num].whether,s[num].nature);break;
			case'C':stateistrue=judge(C,t,s[num].whether,s[num].nature);break;
			case'D':stateistrue=judge(D,t,s[num].whether,s[num].nature);break;
			case'E':stateistrue=judge(E,t,s[num].whether,s[num].nature);break;
		}
	}
	if(stateistrue)//判断完陈述是否正确还需要结和说话人的身份去确认陈述是否合法
	{
		switch(s[num].speaker)
		{
			case'A':if(A==1||A==3&&t==1) return 1;else return 0;
			case'B':if(B==1||B==3&&t==1) return 1;else return 0;
			case'C':if(C==1||C==3&&t==1) return 1;else return 0;
			case'D':if(D==1||D==3&&t==1) return 1;else return 0;
			case'E':if(E==1||E==3&&t==1) return 1;else return 0;
		}
	}
	else
	{
		switch(s[num].speaker)
		{
			case'A':if(A==2||A==3&&t==2) return 1;else return 0;
			case'B':if(B==2||B==3&&t==2) return 1;else return 0;
			case'C':if(C==2||C==3&&t==2) return 1;else return 0;
			case'D':if(D==2||D==3&&t==2) return 1;else return 0;
			case'E':if(E==2||E==3&&t==2) return 1;else return 0;
		}
	}
}
int main()
{
	int i,j,n,cases=0;
	while(cin>>n&&n)
	{
		getchar();
		cases++;
		cout<<"Conversation #"<<cases<<endl;
		for(i=0;i<n;i++)
		{
			input(i);//输入第i个陈述
		}
		memset(res,0,sizeof(res));
		int day=0,night=0;
		for(int A=1;A<=3;A++)//1、2、3分别代表divine,evil,human 
			for(int B=1;B<=3;B++)
				for(int C=1;C<=3;C++)
					for(int D=1;D<=3;D++)
						for(int E=1;E<=3;E++)
							for(int t=1;t<=2;t++)//1表示白天,2表示夜晚
							{
								int ok=1;
								for(i=0;i<n;i++)
									if(islegal(i,A,B,C,D,E,t)){}//判断该陈述是否合法
									else
									{
										ok=0;
										break;
									}
								if(ok)
								{
										res[0][A]=1;
										res[1][B]=1;
										res[2][C]=1;
										res[3][D]=1;
										res[4][E]=1;
										if(t==1) day=1;
										else night=1;
								}
							}
		int impossible=0,nodeducible=1;
		for(i=0;i<5;i++)
		{
			int cnt=0,index;
			for(j=1;j<=3;j++)
				if(res[i][j])
				{
					cnt++;
					index=j;
				}
			if(cnt==0)
			{
				impossible=1;
				break;
			}
			else if(cnt==1)
			{
				char person=i+'A';
				if(index==1)
					cout<<person<<" is divine."<<endl;
				else if(index==2)
					cout<<person<<" is evil."<<endl;
				else
					cout<<person<<" is human."<<endl;
				nodeducible=0;
			}
		}
		if(!day&&!night) impossible=1;
		else if(day&&!night) 
		{
			cout<<"It is day."<<endl;
			nodeducible=0;
		}
		else if(night&&!day)
		{
			cout<<"It is night."<<endl;
			nodeducible=0;
		}
		if(impossible) cout<<"This is impossible."<<endl;
		else if(nodeducible) cout<<"No facts are deducible."<<endl;
		putchar('\n');
	}
	return 0;
}
分享到:
评论
1 楼 hellobin 2013-03-25  
思维缜密啊

相关推荐

    uva272 uva272 uva272

    标题中的"uva272 uva272 uva272"和描述中的"uva272"指的是UVA(University of Virginia)在线判题系统的第272题,这通常与编程竞赛和算法挑战有关。该题目的标签为"算法",意味着我们需要解决一个与计算机算法设计和...

    UVA_示例代码

    UVA(University of Victoria Algorithm Competition)是全球知名的在线算法竞赛平台,它提供了丰富的编程题目供程序员挑战,以提高算法设计和编程能力。UVA Online Judge(简称UVA OJ)是这个平台的实现,支持多种...

    UVA题目大全

    UVA(University of Victoria Algorithm)在线判题系统是世界上最早的在线编程竞赛平台之一,它提供了大量的编程题目供用户练习和提交解决方案。这份资源集成了UVA上的诸多题目,对于学习算法、提升编程技巧以及准备...

    uva最全ac代码

    【标题】"uva最全ac代码" 涉及的是在编程竞赛领域中的一个集锦,特别是针对UVA(University of Victoria Algorithm)在线判题系统的解决方案。UVA是全球最早的在线算法竞赛平台之一,吸引了众多程序员参与并提交代码...

    uva 200~299 22道题解 均accept

    这些文件是针对UVA(University of Virginia)在线判题系统的编程题目的解决方案,主要涵盖了编号为200至299的题目。UVA在线判题平台是一个著名的编程竞赛和练习平台,它提供了各种难度级别的算法和编程问题,旨在...

    uvaoj 习题题目

    【uvaoj 习题题目】相关知识点详解 在编程学习和竞赛中,UVa Online Judge(简称UVa或OJ)是一个广受欢迎的在线评测系统,它为程序员提供了大量练习题目,涵盖算法、数据结构、数学等多个领域。通过解决这些题目,...

    uva 50个题解

    UVA(University of Virginia)在线判题系统是一个广受欢迎的平台,汇集了众多经典算法题目。"uva 50个题解"这个资源显然是针对这个平台的题目的解答集合,特别适合对算法学习和实践感兴趣的人群。下面,我们将深入...

    Uva练习题

    【UVA练习题】是针对在线编程竞赛平台UVA(University of Virginia)的一系列练习题目。UVA是一个广受欢迎的编程竞赛网站,它为程序员提供了一个展示编程技能和解决问题的平台。这里的“不是很难,试试吧”可能意味...

    uva.rar_UVA_posAgent_uva 2d_uva_trilearn

    在IT领域,UVA(University of Virginia)是一个著名的在线算法竞赛平台,它为程序员提供了大量问题来提升算法和编程技能。"uva.rar_UVA_posAgent_uva 2d_uva_trilearn"这个标题可能是指一个与UVA平台相关的项目或...

    AIML.zip_UVA_UVA 499

    标题中的"AIML.zip_UVA_UVA 499"暗示了这是一个与计算机编程相关的压缩文件,特别是针对解决UVA(University of Virginia)在线判题系统中的第499道题目。UVA在线判题系统是程序员提升算法和编程技能的一个平台,...

    uva 部分题目解决代码

    在IT领域,特别是编程竞赛和算法训练中,UVA(University of Virginia)是一个知名的在线判题平台,它为程序员提供了大量的编程题目,旨在提升大家的算法思维和编程能力。"uva 部分题目解决代码"这个压缩包很可能是...

    uva_base_v13.2_robocupuva_robocup2Duva_mathematicswop_platedhx_R

    1. **uva_base**: 这可能是指UVa(University of Virginia)的基础框架或库。UVa是美国弗吉尼亚大学的缩写,该校在计算机科学领域有很高的声誉,特别是因其在线判题系统UVa Online Judge而闻名。"base"通常表示这是...

    UVaOJ-401(Palindromes).zip_401 Palindromes

    标题中的"UVaOJ-401(Palindromes)"表明这是一个关于解决UVa Online Judge(UVa OJ)上编号为401的编程挑战,该挑战的主题是"Palindromes",即回文串。回文串是指一个字符串无论从前读到后还是从后读到前都是相同的,...

    uva_base_hfut_v13.2.tar.gz

    1.Uva_base的编译 在编译球队时,则需要在当前球队文件夹下打开终端输入执行以下命令(以下命令都是在root下执行的): ./configure make clean make 如果运行Uva_base后,出现球员越界或掉线的情况,就重新...

    凸包 UVA109 题解

    根据给定的信息,本文将对UVA109题目的解决方案进行详细解析,重点在于理解题目背景、所需算法原理及具体实现步骤。 ### 题目背景与要求 UVA109是一道关于计算几何的经典题目,主要考察学生对于**凸包**(Convex ...

    uva OJ 题目分类

    世界著名大学UVA OJ平台上的题目部分分类,分的不好请原谅。

    uva531 LCS算法

    uva531最长公共子序列问题水题,应用简单的dp即可ac有更快速的方法欢迎讨论

    Uva 1510 - Neon Sign

    ### Uva 1510 - Neon Sign #### 问题背景与描述 在题目“Uva 1510 - Neon Sign”中,我们面对的是一个霓虹灯招牌设计问题。该霓虹灯招牌由一系列位于圆周上的角点组成,并通过发光管连接这些角点。发光管有两种...

    UVa Online Judge部分题目代码

    UVa Online Judge是一个著名的在线编程竞赛平台,它提供了大量的算法问题供程序员们挑战,以提升他们的编程技巧和算法理解能力。这个压缩包包含了在UVa平台上部分题目的解答,是学习和参考的好资源。让我们详细了解...

    算法入门经典UVa配套题目pdf

    UVa(University of Victoria)在线判题系统是这本书的重要配套资源,提供了大量的实际题目供读者练习。这份"算法入门经典UVa配套题目pdf"包含了书中的所有相关题目,是学习算法和准备编程竞赛的理想参考资料。 1. ...

Global site tag (gtag.js) - Google Analytics