博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Uva592 Island of Logic
阅读量:6114 次
发布时间:2019-06-21

本文共 2792 字,大约阅读时间需要 9 分钟。

 

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

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

 

#include
#include
#include
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) >= 2bool lying(short state, char who){ return (state >> who*2 & 3) + (state >> 10 & 1) >= 2;}//this is too hard to understandbool 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;}//如果状态矛盾,则置为 11bvoid 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
>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;}

转载地址:http://kfkka.baihongyu.com/

你可能感兴趣的文章
uva 10806
查看>>
纯CSS3绘制的黑色图标按钮组合
查看>>
Linux中环境变量文件及配置
查看>>
从0开始学Flutter
查看>>
mysql操作入门基础之对数据库和表的增删改查
查看>>
IIS负载均衡
查看>>
分布式事务,EventBus 解决方案:CAP【中文文档】
查看>>
Linux下的CPU性能瓶颈分析案例
查看>>
spring mvc入门
查看>>
2012在数据库技术会议上的讲话PPT打包
查看>>
【Android】 TextView设置个别字体样式
查看>>
python svn
查看>>
raise语句
查看>>
sequence2(高精度dp)
查看>>
如何向 Linux 内核上游提交 Patch ?
查看>>
Go编程笔记(7)
查看>>
Go语言int类型绑定方法
查看>>
pid控制的文章
查看>>
MySQL中EXPLAIN命令详解
查看>>
redis 单点部署
查看>>