描述

This problem is based on the game of Black Vienna. In this version there are three players and 18 cards labeled A-R. Three of the cards are set aside (hidden) and form the "Black Vienna" gang. The remaining cards are shuffled and dealt to the players so that each player has 5 cards. Players never reveal their cards to each other. There is a separate deck of "interrogation cards" which contain three distinct letters in ascending order, like ACG or BHR.  Turns rotate through players 1, 2, and 3. On each player's turn, that player selects an interrogation card, puts it face up in front of another player, and that other player must indicate the total number of these cards being held, without saying which ones.  All players see the result of the "interrogation". The play continues until a player deduces the three cards in the "gang".     For example, suppose the cards are distributed as follows, and the game then proceeds:

Player 1: DGJLP; Player 2: EFOQR; Player 3: ACHMN;  Gang: BIK Turn 1:  Player 1 interrogates player 2 with BJK; answer 0

Turn 2:  Player 2 interrogates player 3 with ABK; answer 1 Turn 3:  Player 3 interrogates player 2 with DEF; answer 2

Turn 4: Player 1 interrogates player 2 with EIL; answer 1 Turn 5:  Player 2 interrogates player 3 with FIP; answer 0

Turn 6:  Player 3 interrogates player 1 with GMO; answer 1 Turn 7:  Player 1 interrogates player 2 with OQR; answer 3

Turn 8:  Player 2 interrogates player 3 with ADQ; answer 1 Turn 9:  Player 3 interrogates player 1 with EGJ; answer 2

In fact, the game does not need to get to turn 9.  With enough thought, player 1 can deduce after turn 8 that the gang is BIK.  It is your job to analyze records of games and deduce the earliest time that the gang could be determined for sure.

输入

The input will consist of one to twelve data sets, followed by a line containing only 0.   The first line of a dataset contains the number, t, of turns reported, 2 ≤ t ≤ 15.  The next line contains four blank separated strings for the hands of players 1, 2, and 3, followed by the cards for the gang. The remaining t lines of the data set contain the data for each turn in order.  Each line contains three blank separated tokens:  the number of the player interrogated, the string of interrogation letters, and the answer provided. All letter strings will contain only capital letters from A to R, in strictly increasing alphabetical order.  The same interrogation string may appear in more than one turn of a game.

输出

There is one line of output for each data set.  The line contains the single character "?" if no player can be sure of the gang after all the turns listed.  If a player can determine the gang, the line contains the earliest turn after which one or more players can be sure of the answer.

样例输入

9

DGJLP EFOQR ACHMN BIK

2 BJK 0

3 ABK 1

2 DEF 2

2 EIL 1

3 FIP 0

1 GMO 1

2 OQR 3

3 ADQ 1

1 EGJ 2

3

ABCDE FGHIJ KLMNO PQR

3 BKQ 1

1 ADE 3

2 CHJ 2

0

样例输出

8

?

include<iostream>
using namespace std; const int PLAYERS = 3, // check against final problem statement!
MAX_TURNS = 15, HAND = 5, HID = 3, UNK = HID+HAND*(PLAYERS-1);
int turns; char quest[MAX_TURNS][3+1], // interrogations
hand[PLAYERS + 1][5+1], //actual hands, gang at end
maybe[PLAYERS + 1][HAND+1]; //possible hands, gang char unk[UNK]; // letters not in one player's hand
int who[MAX_TURNS], // who interrogated
matches[MAX_TURNS], // matches in interogation
used[PLAYERS+1]; // amount of maybe hand filled
int solved; // max turns needed for current player for comb. so far int Max(int a,int b);
void solve(int i,char unk[]);
int countConsistent(char choice[][HAND+1]);
int countDups(char a1[],char a2[]); int main()
{
//freopen("in.txt","r",stdin);
int i,j;
int bestSolved;
while(scanf("%d",&turns)!=EOF && turns>0)
{
for(i=0;i<=PLAYERS;i++)
scanf("%s",&hand[i]);
int t;
for(t=0;t<turns;t++)
{
scanf("%d",&who[t]);
who[t]--; // internal 0 based
scanf("%s",&quest[t]);
scanf("%d",&matches[t]);
}
bestSolved=MAX_TURNS;
int p;
char unkStr[18-5+1];
for(p=0;p<PLAYERS;p++)
{
memset(unkStr,'\0',sizeof(unkStr));
for(j=0;j<=PLAYERS;j++){
if(j!=p)
strcat(unkStr,hand[j]);
}
strcpy(maybe[p],hand[p]); // player knows own
used[p] = HAND; // no further characters to choose
solved = 0; // after recursion max turns to eliminate a maybe
solve(0,unkStr);
memset(maybe[p],'\0',sizeof(maybe[p]));
used[p]=0;
if(solved<bestSolved)
bestSolved=solved;
}
if(bestSolved<turns)
printf("%d\n",bestSolved+1);
else
printf("?\n");
}//end while
return 0;
}//end main() int Max(int a,int b)
{ return (a>b)?a:b; } // accumulate combinations recursively, check when one is complete
void solve(int i,char unk[])
{
if(i==(18-5)){ // assigned all choices, now check
if (maybe[PLAYERS][0] == unk[i-HID]) return; //match end gang char
solved = Max(solved, countConsistent(maybe));
}
else{
int j;
for(j=0;j<=PLAYERS;j++){
if((j<PLAYERS && used[j]<5) || (j==PLAYERS && used[j]<3)){ //add char to partial hand
maybe[j][used[j]]=unk[i];
used[j]++;
solve(i+1,unk);
used[j]--; // undo change before trying next player
}
}
}
} // return first inconsistent turn (0 based) or total turns if consistent
int countConsistent(char choice[][HAND+1])
{
int t=0;
while(t<turns &&
countDups(choice[who[t]],quest[t])==matches[t])
t++;
return t;
} int countDups(char a1[],char a2[])
{
int i,j;
int n=0;
for(i=0;i<5;i++){
for(j=0;j<3;j++)
if(a1[i]==a2[j])
n++;
}
return n;
}

  

1091-Black Vienna的更多相关文章

  1. [swustoj 1091] 土豪我们做朋友吧

    土豪我们做朋友吧(1091) 问题描述: 人都有缺钱的时候,缺钱的时候要是有个朋友肯帮助你,那将是一件非常幸福的事情.有N个人(编号为1到N),一开始他们互相都不认识,后来发生了M件事情,事情分为2个 ...

  2. ural 1091. Tmutarakan Exams 和 codeforces 295 B. Greg and Graph

    ural 1091 题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1091 题意是从1到n的集合里选出k个数,使得这些数满足gcd大于1 ...

  3. [Swust OJ 1091]--土豪我们做朋友吧(并查集,最值维护)

    题目链接:http://acm.swust.edu.cn/problem/1091/ Time limit(ms): 1000 Memory limit(kb): 32768   人都有缺钱的时候,缺 ...

  4. ural 1091. Tmutarakan Exams(容斥原理)

    1091. Tmutarakan Exams Time limit: 1.0 secondMemory limit: 64 MB University of New Tmutarakan trains ...

  5. 51Nod 1091 线段的重叠(贪心+区间相关,板子题)

    1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 2 ...

  6. PAT 乙级 1091 N-自守数 (15 分)

    1091 N-自守数 (15 分) 如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3×92​2​​=25392,而 25392 的末尾两位正好是 ...

  7. nyoj 1091 还是01背包(超大数dp)

    nyoj 1091 还是01背包 描述 有n个重量和价值分别为 wi 和 vi 的物品,从这些物品中挑选总重量不超过W的物品,求所有挑选方案中价值总和的最大值 1 <= n <=40 1 ...

  8. 【PAT】1091 Acute Stroke(30 分)

    1091 Acute Stroke(30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the s ...

  9. ural 1091. Tmutarakan Exams(容斥)

    http://acm.timus.ru/problem.aspx? space=1&num=1091 从1~s中选出k个数,使得k个数的最大公约数大于1,问这种取法有多少种. (2<=k ...

随机推荐

  1. [记录] nicescroll 在bootstrap tabs中工作

    Operlapping Nicescroll scrolbars in Bootstrap tabs 因为我的tab是指定id的 <!-- Nav tabs --> <ul clas ...

  2. 【转】BUG敏感度的培养

    在我们刚踏入软件测试行业时,不管你是专业的.非专业的,培训出来的还是未培训的.刚进公司时你看着身边的同时报的Bug很多并且大都是严重程度高,自己也很想提高一下,想要提高自己的bug敏感度,建议从下面几 ...

  3. HashMap的一般用法以及遍历方法

    private Map<Integer,String> selected = new HashMap<Integer,String>(); selected.put(key,v ...

  4. 【转】ASP.NET MVC 使用 FluentScheduler 定时器计划任务

    MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲击与影响,那这个世界永远像现在不变就行了,大家都好好的,待在自 ...

  5. HTML——表格table标签,tr或者td

    表格定义和用法 <tr> 标签定义 HTML 表格中的行. tr 元素包含一个或多个 th 或 td 元素. HTML 与 XHTML 之间的差异 在 HTML 4.01 中,tr 元素的 ...

  6. 仿战旗tv

    模仿战旗tv做的一个小项目,还需继续完善. 以下为链接地址: https://github.com/NearMilk/ZhanqiTV

  7. 利用css3动画和border来实现圆形进度条

    最近在学习前端的一些知识,发现border的功能十分强大啊! 首先来看看demo 就是这么一个圆形的进度条,在文本框中输入0-100的数值下面的进度条相应的转到多少 这个主要是利用border,旋转和 ...

  8. Java实战之04JavaWeb-07Listener和Filter

    一.监听器Listener javaEE的13们规范中 包括servlet技术和jsp技术 servlet规范中包括三门技术:(servlet的三大组件) servelt技术  Listener技术 ...

  9. 踩过的坑系列之InputStream.read(byte[])方法

    项目之前都是好好的,最近现场那边出现一个问题,报错不是合法的json字符串,这个json字符串是通过http请求访问获得的. 通过直接在浏览器上直接访问http这个请求,发现返回的json也是完全正确 ...

  10. C/C++代码检视要点

    4.1.1       C/C++代码检视要点 代码检视技能属于开发人员的基本功,能够很大程度地反应出开发人员的能力水平,前面4.4.1节已经讲过提高评审检视的方法.下面以实际的C/C++语言方面的代 ...