• uva 592 Island of Logic (收索)



      Island of Logic 

    The Island of Logic has three kinds of inhabitants: divine beings that always tell the truth, evil beings that always lie, and human beings that are truthful during the day and lie at night. Every inhabitant recognizes the type of every other inhabitant.

    A social scientist wants to visit the island. Because he is not able to distinguish the three kinds of beings only from their looks, he asks you to provide a communication analyzer that deduces facts from conversations among inhabitants. The interesting facts are whether it is day or night and what kind of beings the speakers are.

     

    Input 

    The input file contains several descriptions of conversations. Each description starts with an integer  n , the number of statements in the conversation. The following  n  lines each contain one statement by an inhabitant. Every statement line begins with the speaker's name, one of the capital letters  A B C D E , followed by a colon ` : '. Next is one of the following kinds of statements:

     

    • I am [not] ( divine | human | evil | lying ).
    • X is [not] ( divine | human | evil | lying ).
    • It is ( day | night ).

    Square brackets [] mean that the word in the brackets may or may not appear, round brackets () mean that exactly one of the alternatives separated by |must appear. X stands for some name from ABCDE. There will be no two consecutive spaces in any statement line, and at most 50 statements in a conversation.

    The input is terminated by a test case starting with n = 0.

     

    Output 

    For each conversation, first output the number of the conversation in the format shown in the sample output. Then print `` This is impossible. '', if the conversation cannot happen according to the rules or `` No facts are deducible. '', if no facts can be deduced. Otherwise print all the facts that can be deduced. Deduced facts should be printed using the following formats:

     

    • X is ( divine | human | evil ).
    • It is ( day | night ).

    X is to be replaced by a capital letter speaker name. Facts about inhabitants must be given first (in alphabetical order), then it may be stated whether it is day or night.

    The output for each conversation must be followed by a single blank line.

     

    Sample Input 

    1
    A: I am divine.
    1
    A: I am lying.
    1
    A: I am evil.
    3
    A: B is human.
    B: A is evil.
    A: B is evil.
    0
    

     

    Sample Output 

    Conversation #1
    No facts are deducible.
    
    Conversation #2
    This is impossible.
    
    Conversation #3
    A is human.
    It is night.
    
    Conversation #4
    A is evil.
    B is divine.
    

    题目大意:一个逻辑岛上住有人类,恶魔和神,恶魔总是说谎话,人在白天说真话,在晚上说假话,神一直说真话,现在给出一些人说的话,从中判断并且输出可以确定的信息。

    解题思路:将所有语句存成结构体的形式,只需要记录说话人,被说人,说话肯否定(not),和对象。处理方法就是将所有情况列举出来,然后将语句进行判断。如果出现两组满足,就将两组中相同的保留(这些是可以确定的)

    注意:即使没有人类被确定,但是白天黑夜已经被分出来了,也要输出。

    提供一些数据:

    6
    A: B is human.
    A: B is evil.
    B: A is human.
    C: A is not lying.
    B: C is not human.
    D: E is not lying.
    4
    A: I am human.
    A: It is night.
    B: I am human.
    B: It is day.
    3
    A: I am human.
    B: I am human.
    A: B is lying.
    3
    A: I am divine.
    B: A is not lying.
    A: B is lying.
    3
    A: I am divine.
    B: A is lying.
    A: B is lying.
    5
    A: B is human.
    A: B is evil.
    B: A is evil.
    C: A is not lying.
    B: It is day.
    5
    C: A is not lying.
    A: B is human.
    A: B is evil.
    B: A is evil.
    B: It is day.
    1
    A: A is not lying.
    1
    A: A is lying.
    2
    E: E is evil.
    E: E is divine.
    7
    A: It is night.
    B: It is day.
    C: I am human.
    E: C is human.
    C: E is divine.
    A: B is lying.
    B: C is evil.
    0

    *********************************************************************************

    Conversation #1
    A is human.
    B is divine.
    C is evil.
    It is night.

    Conversation #2
    A is evil.
    B is human.
    It is day.

    Conversation #3
    It is day.

    Conversation #4
    This is impossible.

    Conversation #5
    No facts are deducible.

    Conversation #6
    A is evil.
    B is divine.
    C is evil.
    It is day.

    Conversation #7
    A is evil.
    B is divine.

    C is evil.
    It is day.

    Conversation #8
    No facts are deducible.

    Conversation #9
    This is impossible.

    Conversation #10
    E is human.
    It is night.

    Conversation #11
    A is evil.
    C is evil.
    E is evil.
    It is day.

    ********************************************************************************

    #include<iostream>
    #include<string.h>
    using namespace std;
    
    #define N 55
    #define M 10
    
    int people[M];
    int brith[M];
    int n;
    int ok;
    int FP;
    int now[M];
    int yes[M];
    
    struct say{
    	char talk;
    	char name;
    	int bo;
    	int sex;
    };
    
    void thesome()
    {
    	for(int i = 0; i < 6; i++)
    		if(now[i] != people[i])
    			yes[i] = 1;
    }
    
    int ture_say(say f)
    {
    	if(f.sex != -1)
    	{
    		if(f.name == 'T')
    		{
    			if(f.bo && f.sex - 4 == people[0])
    				return 1;
    			else if(!f.bo && f.sex - 4 != people[0])
    				return 1;
    			else
    				return 0;
    		}
    		else
    		{
    			int id = f.name - 'A' + 1;
    			if(f.bo && f.sex == people[id])
    				return 1;
    			else if(!f.bo && f.sex != people[id])
    				return 1;
    			else
    				return 0;
    		}
    	}
    	else
    	{
    		int id = f.name - 'A' + 1;
            
    		if(people[id] == 3 && !f.bo)
    			return 1;
    		else if (people[id] == 1 && f.bo)
    			return 1;
    		else if(people[id] == 2)
    		{
    			if(people[0] && !f.bo)
    				return 1;
    			else if(!people[0] && f.bo)
    				return 1;
    			else
    				return 0;
    		}
    		else
    			return 0;
    	}
    }
    
    int write(char str[])
    {
    	if(strncmp(str, "divine.", 7) == 0)
    		return 3;
    	else if(strncmp(str, "human.", 6) == 0)
    		return 2;
    	else if(strncmp(str, "evil.", 5) == 0)
    		return 1;
    	else if(strncmp(str, "day.", 4) == 0)
    		return 5;
    	else if( strncmp(str, "night.", 6) == 0)
    		return 4;
    	else if( strncmp(str, "lying.", 6) ==0)
    		return -1;
    }
    
    void read(say tem[])
    {
    	char str[M];
    	int id;
        
    	for(int i = 0; i < n; i++)
    	{
    		cin >> str;
    		tem[i].talk = str[0];
    		id = str[0] - 'A' + 1;
    		brith[id] = 1;
            
    		cin >> str;
    		if(strcmp(str, "It") == 0)
    			tem[i].name = 'T';
    		else if(str[0] == 'I')
    			tem[i].name = tem[i].talk;
    		else
    		{
    			tem[i].name = str[0];
    			id = str[0] - 'A' + 1;
    			brith[id] = 1;
    		}
            
    		cin >> str;
    		cin >> str;
    		if(strcmp(str, "not"))
    		{
    			tem[i].bo = 1;
    			tem[i].sex = write(str);
    		}
    		else
    		{
    			tem[i].bo = 0;
    			cin >> str;
    			tem[i].sex = write(str);
    		}
            
            //		if(tem[i].sex == -1 && tem[i].talk == tem[i].name && tem[i].bo)
            //			FP = 1;
    	}
    }
    
    int judge(say tem[])
    {
    	for(int i = 0; i < n; i++)
    	{
    		int id = tem[i].talk - 'A' + 1;
    		if(people[id] == 3)
    		{
    			if(ture_say(tem[i]))
    				continue;
    			else
    				return 0;
    		}
    		else if(people[id] == 2)
    		{
    			int f = ture_say(tem[i]);
    			if( (people[0] && f) || (!people[0] && !f) )
    				continue;
    			else
    				return 0;
    		}
    		else if(people[id] == 1)
    		{
    			if(!ture_say(tem[i]))
    				continue;
    			else
    				return 0;
    		}
    	}
    	return 1;
    }
    
    void build(int k, say tem[])
    {
    	if(k < 6)
    	{
    		if(brith[k])
    		{
    			for(people[k] = 1; people[k] < 4; people[k]++)
    				build(k + 1, tem);
    		}
    		else
    			build(k + 1, tem);
    	}
    	else if(judge(tem))
    	{
            //		cout << k << endl;
    		if(ok >= 1)
    			thesome();
    		else
    			for(int i = 0; i < 6; i++)
    				now[i] = people[i];
    		ok++;
    	}
        
    }
    
    int main()
    {
    	int t = 1;
    	while(cin >> n, n)
    	{
    		// Init.
    		memset(people, 0, sizeof(people));
    		memset(brith, 0, sizeof(brith));
    		ok = 0;
    		say tem[N];
            //	FP = 0;
    		memset(yes, 0,sizeof(yes));
            
    		// ReadZZg.
    		read(tem);
            
    		cout << "Conversation #" << t++ << endl;
            //		if(FP)
            //			cout << "This is impossible." << endl;
            //		else
            //		{
            for(people[0] = 0; people[0] < 2; people[0]++)
                build(1, tem);
            
            if(ok == 0)
                cout << "This is impossible." << endl;
            else
            {
                //*
                int oi = 0;
                for(int i = 1; i < 6; i++)
                {
                    if(!yes[i] && now[i])
                    {
                        oi++;
                        char c = 'A' + i - 1;
                        if(now[i] == 3)
                            cout << c << " is divine." << endl;
                        else if(now[i] == 2)
                            cout << c << " is human." << endl;
                        else if(now[i] == 1)
                            cout << c << " is evil." << endl;
                    }
                }
                
                if(oi == 0 && yes[0])
                    cout << "No facts are deducible." << endl;
                if(now[0] && !yes[0])
                    cout << "It is day." << endl;
                else if(!yes[0])
                    cout << "It is night." << endl;
                //			}
            }
            cout << endl;
    	}
    	return 0;}
  • 相关阅读:
    升级PHP到5.2,mysql到5.1
    Intel集成显卡安装Linux的解决方法
    【6】jQuery学习——入门jQuery选择器之过滤选择器内容过滤选择器
    【5】jQuery学习——入门jQuery选择器之过滤选择器基本过滤选择器
    【4】jQuery学习——入门jQuery选择器之层次选择器
    【13】jQuery学习——入门jQuery对象的筛选之过滤
    【12】jQuery学习——入门jQuery属性之元素属性的设置与移除
    【9】jQuery学习——入门jQuery选择器之过滤选择器属性过滤选择器
    【7】jQuery学习——入门jQuery选择器之过滤选择器可见性过滤选择器
    【11】jQuery学习——入门jQuery选择器之过滤选择器表单对象属性过滤选择器
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3239199.html
Copyright © 2020-2023  润新知