题意:神人鬼三个种族,神只说真话,鬼只说假话,人白天说真话,晚上说假话。根据对话内容区分种族和白天黑夜。  最多有A, B, C, D, E五个人

算法:枚举A, B, C, D, E的种族情况和白天黑夜的情况。每个人有可能是神人鬼,所以用两个bit表示,白天黑夜用1个bit表示。一共需要11 bits.

 

#include<iostream>
#include<cstdio>
#include<string>
using namespace std; struct statement
{
char a;//speaker
char b;//object 等于状态的偏移量
bool c;//not
char d;
} p[50]; /*
A: I am [not] ( divine | human | evil | lying ).
A: X is [not] ( divine | human | evil | lying ).
A: It is ( day | night ).
*/
void get(statement &t)
{
char c;
cin >> c;
t.a = c - 'A';
cin >> c >> c;
if (c == 'I')
{
cin.get(c);
if (c == 't')//It is
t.b = 5;//day|night偏移5
else//I am
t.b = t.a;
}
else
t.b = c - 'A';//0-4对应 A-E 5对应day|night string s;
cin >> s >> s;
if (s == "not") t.c = true, cin >> s; else t.c = false;
switch (s[0])
{
case 'd': t.d = 0; break;//day divine
case 'e': t.d = 2; break;//evil
case 'l': t.d = 3; break;//lying
default: t.d = 1;//human night
}
} //human + night = 2
//evil + (day|night) >= 2
bool lying(short state, char who)
{
return (state >> who*2 & 3) + (state >> 10 & 1) >= 2;
} //this is too hard to understand
bool check(statement st, short s)
{
return (st.d == 3 ? lying(s, st.b) : st.d == (s >> st.b + st.b & 3)) ^ st.c ^ lying(s, st.a);
} //A-E 每个占2位; day,night 占1位
const int MAX_STATE=1<<11;
bool is_valid_state(int s)
{
for(int i=0;i<5;i++)
if((s>>i*2 & 3)==3)
return false;
return true;
} //this is better then check function
//判断说话的人是否说谎话
//判断话的内容是否是真的
bool judge(statement st, short s)
{
//if speaker is lying
bool speaker=lying(s, st.a); //if statement is true
bool object; //It is ( day | night ).
if(st.b==5)
{
object = (s >> 10 & 1)==st.d;
return speaker!=object;
} //lying
if(st.d==3)
{
if(st.c)
object = !lying(s, st.b);
else
object = lying(s, st.b); return speaker!=object;
} // X is [not] ( divine | human | evil )
object = (s >> st.b*2 & 3)==st.d; return speaker!=object;
} //如果状态矛盾,则置为 11b
void combine(short &a, short b)
{
for (int i = 0; i < 6; ++i)
if (a & (3 << i + i) ^ b & (3 << i + i))
a |= (3 << i + i);
} const char *s[] = { "divine", "human", "evil" }; int main()
{
#ifndef ONLINE_JUDGE
freopen("./uva592.in", "r", stdin);
#endif
int Kase=0;
int n;
//printf("%0X\n", MAX_STATE);
while(cin>>n && n)
{
cout << "Conversation #" << ++Kase << endl;
short a = -1;
for(int i=0; i<n; i++) get(p[i]);
for(int i=0; i<MAX_STATE; i++) if(is_valid_state(i))
{
bool b=true;
for (int j=0; j<n; ++j) if (!check(p[j], i))
{
b = false;
break;
}
if (!b) continue;
if (a == -1) a = i; else combine(a, i);
}
if (a == -1) cout << "This is impossible." << endl;
if (a == 0xFFF) cout << "No facts are deducible." << endl;
for (int i = 0; i < 5; ++i)
{
int x = a>>i*2 & 3;
if (x != 3) cout << char(i + 'A') << " is " << s[x] << "." << endl;
}
int x = a>>10 & 3;
if (x != 3) cout << "It is " << (x ? "night." : "day.") << endl;
cout << endl;
} return 0;
}

Uva592 Island of Logic的更多相关文章

  1. uva 592 Island of Logic (收索)

      Island of Logic  The Island of Logic has three kinds of inhabitants: divine beings that always tel ...

  2. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  3. POJ题目细究

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  4. [LeetCode] Island Perimeter 岛屿周长

    You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen ...

  5. QuartusII Design partion and logic lock

    Design partion Design partion常用于“增益变量(QIC)”,通过Design Partition对子模块进行“逻辑分区”,在Design Partition Window中 ...

  6. 463. Island Perimeter

    https://leetcode.com/problems/island-perimeter/ 在一个N×N的矩阵中,N<100,1代表岛,0代表海,岛内没有海,求岛的周长 [[0,1,0,0] ...

  7. Leetcode-463 Island Perimeter

    #463. Island Perimeter You are given a map in form of a two-dimensional integer grid where 1 represe ...

  8. 使用struts的logic:iterate标签遍历列表时得到显示序号

    <logic:notEmpty name="sList" scope="request"> <logic:iterate id="e ...

  9. LeetCode Island Perimeter

    原题链接在这里:https://leetcode.com/problems/island-perimeter/ 题目: You are given a map in form of a two-dim ...

随机推荐

  1. android学习视频(实战项目演练)

    1.基于Android平台实战无线点餐系统(客户端(Client)和服务端(Server))①http://kuai.xunlei.com/d/xmBrDwI8CAAyXVFRa3d②http://k ...

  2. [Papers]MHD, $\p_3\pi$, Lebesgue space [Jia-Zhou, JMAA, 2012]

    $$\bex \p_3\pi\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=2,\quad 3\leq q\leq \infty. \ee ...

  3. selenium python (二) 元素定位方法

    定位的原则就是:id name class 优先,强烈建议和前端哥哥搞好关系.定位就不是问题:实在不行就xpath和css大部分偶可以定位到. webdriver定位的方法是通过一个By类,By类中有 ...

  4. [转]LoadRunner参数化详解

    http://www.cnblogs.com/fnng/archive/2012/06/22/2558900.html 距离上次使用loadrunner 已经有一年多的时间了.初做测试时在项目中用过, ...

  5. 如何使用Fiddler调试线上JS代码

    大家平时肯定都用过火狐的Firebug或者谷歌的调试工具来调试JS,但遗憾的是我们不能像编辑html,css那样来直接新增或者删除JS代码. 虽然可以通过调试工具的控制台来动态执行JS代码,但有时候却 ...

  6. 数往知来 ASP.NET_多线程_Socket<十五>

    一.ASP.NET B/S  做网站(动态).管理系统(OA,进销存等) C/S--窗体软件 为什么现在很少用C/S做进销存等软件 B/S部署方便   C/S要安装 动态:与服务器(IIS(软件))进 ...

  7. 学习内容:Html5+Axure原型设计

    今日主要在http://www.runoob.com/html/html5-intro.html和http://www.imooc.com/learn/9网站上学习Html的知识,head.title ...

  8. 基于MapReduce的关系代数运算(2)

    1.自然连接 Map函数:对于R中的每个元组(a,b),生成键值对(b,(R,a)),对于S中的每个元组(b,c),生成键值对(b,(S,c)) Reduce函数:每个键值b会与一系列对相关联,这些对 ...

  9. mediawiki 的使用

    首先,程序里会先加载 includes/DefaultSettings.php,然后再加载 LocalSettings.php,这样定义一些权限.其中 DefaultSettings.php 是默认的 ...

  10. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...