一道判断的面试题

昨儿个群里面讨论一个算法,在

http://blog.youkuaiyun.com/v_JULY_v/archive/2011/01/10/6126444.aspx

中,第22题博主没有写出代码,表示代码不好写。我对于穷举算法不怎么会写,于是很差劲地写了下面的代码(循环太多),题目为:

有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,
再分别在A、B、C三人额头上贴任意两张牌,

A、B、C三人都可以看见其余两人额头上的牌,
看完后让他们猜自己额头上是什么颜色的牌,
A说不知道,B说不知道,C说不知道,然后A说知道了。

请教如何推理,A是怎么知道的。如果用程序,又怎么实现呢?

 

 我的代码实现如下: 


  
// 假定0为红,1为蓝色
//

bool isknown( int * m, int * n)
{
int red = 0 ;
int blue = 0 ;

for ( int i = 0 ; i < 2 ; ++ i)
{
if ( m[i] == 0 )
{
red
++ ;
}
else
{
blue
++ ;
}

if ( n[i] == 0 )
{
red
++ ;
}
else
{
blue
++ ;
}
}

if ( red > 2 || blue > 2 )
{
return true ;
}

return false ;
}

bool get ( int * a, int * b, int * c, int * d)
{
// 遍历所有的可能性
bool found = false ;
for ( int a1 = 0 ; a1 < 2 ; ++ a1)
{
a[
0 ] = a1;
for ( int a2 = 0 ; a2 < 2 ; ++ a2)
{
a[
1 ] = a2;

for ( int b1 = 0 ; b1 < 2 ; ++ b1)
{
b[
0 ] = b1;
for ( int b2 = 0 ; b2 < 2 ; ++ b2)
{
b[
1 ] = b2;

for ( int c1 = 0 ; c1 < 2 ; ++ c1)
{
c[
0 ] = c1;
for ( int c2 = 0 ; c2 < 2 ; ++ c2)
{
c[
1 ] = c2;

if ( ! isknown(a,b) && ! isknown(a,c) && ! isknown(b,c) )
{
return true ;
}

}
}
}
}
}
}

return true ;
}

int main( int argc, char * argv[])
{
int a[ 2 ], b[ 2 ], c[ 2 ], d[ 2 ];
get (a,b,c,d);

printf(
" a:%d,%d, b:%d,%d, c:%d,%d " , a[ 0 ], a[ 1 ], b[ 0 ], b[ 1 ], c[ 0 ], c[ 1 ]);

return 0 ;
}

不知道还有没有更好的方法,请各位看官赐教了!

 /*
  * @   2011-3-10
  *
  * Copyright (c) 2011 Ubunoon.
  * All rights reserved.
  *
  * email: netubu#gmail.com  replace '#' to '@'

  * http://www.cnblogs.com/ubunoon
  */

转载于:https://www.cnblogs.com/ubunoon/archive/2011/03/10/interreview_red_blue_guess.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值