算法提高 扶老奶奶过街
时间限制:1.0s 内存限制:256.0MB
一共有5个红领巾,编号分别为A、B、C、D、E,老奶奶被他们其中一个扶过了马路。
五个红领巾各自说话:
A :我和E都没有扶老奶奶
B :老奶奶是被C和E其中一个扶过大街的
C :老奶奶是被我和D其中一个扶过大街的
D :B和C都没有扶老奶奶过街
E :我没有扶老奶奶
已知五个红领巾中有且只有2个人说的是真话,请问是谁扶这老奶奶过了街?
若有多个答案,在一行中输出,编号之间用空格隔开。
例如
A B C D E(这显然不是正确答案
解法1--位运算
#include <iostream>
using namespace std;
#define N 5
int main()
{
int i,j,t,a[N];
for (i = 0x10; i >0; i>>=1)
{
t=i;
for (j = N-1; j >= 0; j--)
{
a[j] = t & 1;
t>>=1;
}
//ABCDE5个变量存5个人的真假话状态,1为真话,0为假话
int A=(a[0]+a[4]==0);//A :我和E都没有扶老奶奶
int B=(a[2]+a[4]==1);//B :老奶奶是被C和E其中一个扶过大街的
int C=(a[2]+a[3]==1);//C :老奶奶是被我和D其中一个扶过大街的
int D=(a[1]+a[2]==0);//D :B和C都没有扶老奶奶过街
int E=(a[4]==0);//E :我没有扶老奶奶
if(A+B+C+D+E==2)//5个人有且只有2个人说的是真话
{
for (j = 0; j < N; j++)
{
if(a[j]) cout<<char('A'+j)<<' ';
}
}
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
#define N 5
int main()
{
int a[N]={1,0,0,0,0};//1扶了。0没扶。
do
{
//ABCDE5个变量存5个人的真假话状态,1为真话,0为假话
int A=(a[0]+a[4]==0);//A :我和E都没有扶老奶奶
int B=(a[2]+a[4]==1);//B :老奶奶是被C和E其中一个扶过大街的
int C=(a[2]+a[3]==1);//C :老奶奶是被我和D其中一个扶过大街的
int D=(a[1]+a[2]==0);//D :B和C都没有扶老奶奶过街
int E=(a[4]==0);//E :我没有扶老奶奶
if(A+B+C+D+E==2)//5个人有且只有2个人说的是真话
{
for (int i = 0; i < N; i++)
{
if(a[i]) cout<<char('A'+i)<<' ';
}
}
}
while(prev_permutation(a,a+N));
return 0;
}
评测结果 | 正确 |
得分 | 100 |
CPU使用 | 0ms |
内存使用 | 948.0KB |