游客 Signup | Login
中文 | En

3653 - ADV-124 凶手

巴斯维克命案抓住了六个嫌疑犯,他们的口供如下:
  A:我不是罪犯
  B:A、C中有一个是罪犯
  C:A和B说了假话
  D:C和F说了假话
  E:其他五个人中,只有A和D说了真话
  F:我是罪犯
  他们中只有一半说了真话,凶手只有一个。
  本题可能有多种可能性,即正确答案(找到唯一的凶手)可能有多个,但每一个可能的答案(某一个是凶手)都满足上述口供。
  请编程找出可能的凶手输出。
  样例:(假设唯一的凶手是A或者D或者E,则输出结果为三行,按字母顺序依次输出)
  A
  D
  E

 

Input

Output

Examples

Input


                

Output


                

Solution C++

#include<iostream>
using namespace std;
#define N 6
int a[N];//存放ABCDEF是否是罪犯的状态,1是罪犯,0不是罪犯 
int v[N];//判断出是罪犯的记录 
void f(int idx)
{
	if(idx==N)
	{
		int sum=0,i;
		for(i=0;i<N;i++)
			sum+=a[i];
		if(sum==1)//凶手只有一个
		{
			//ABCDEF6个变量存6个人的真假话状态,1为真话,0为假话 
			int A=(a[0]==0);//A:我不是罪犯
			int B=(a[0]+a[2]==1);//B:A、C中有一个是罪犯
			int C=(A+B==0);//C:A和B说了假话
			int F=(a[5]==1);//F:我是罪犯
			int D=(C+F==0);//D:C和F说了假话
			int E=(A+D==2&&B+C+F==0);//E:其他五个人中,只有A和D说了真话
			if(A+B+C+D+E+F==3)//他们中只有一半说了真话
			{
				for(i=0;i<N;i++)
				{
					if(a[i])
						v[i]=1; 
				}
			}
			
		}
		return;
	}
	a[idx]=0;
	f(idx+1);
	a[idx]=1;
	f(idx+1);
}
int main()
{
	f(0);
	for(int i=0;i<N;i++)
	{
		if(v[i])
			cout<<char(i+'A')<<endl;
	}
	return 0;
}

Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题