Private Sub Command1_Click()
Cls
For x = 1 To 4
If (x <>1) + (x = 3) + (x = 4) + (x <>4) = -3 Then
T = Chr$(64 + x)
End If
Next x
Select Case T
Case "A"
Label1.Caption = "小偷是甲"
Case "B"
Label1.Caption = "小偷是乙"
Case "C"
Label1.Caption = "小偷是丙"
Case "D"
Label1.Caption = "小偷是丁"
End Select
End Sub
f5运行就可以了,如果不懂再问。
分析:可以采用枚举法,依次假设甲,乙拆凯,丙,丁是小偷,再根据他们的谈话找到关系式.由于有一个人说谎,所以四个关系式相加值为-3时辩御散即可找到小偷.
(X1)+(X=3)+(X=4)+(X4)=-3
这个问题我用5位二进制数来表示,总的可能排列有32种,逐一检验就可以找到答案,具体看代码:
#include <stdio.h>#include <conio.h>
#define N 5
int main(){
unsigned int bin,max,i,w,hat[N]={0}
for(max=1,i=0i<N++i)max*=2//计算max=2^N
for(bin=0bin<max++bin){//用N位二进制数表示每个人的帽子状态,bin=00000~11111
for(w=1,i=0i<N++i,w*=2){//获取每个人戴的帽子(0为红帽子,1为白帽子)
桐埋hat[i]=((bin&w)!=0) //按位与来检测其帽子颜色
}
for(w=0,i=0i<N++i)w+=hat[i]//统计总的白帽子数
//检验甲的说法
稿兆 if(hat[0]){//如果甲戴白帽子,说真话
if(w-1!=1)continue//但是除了甲外,白帽子数不是1,说明解错误,换下一组解
}else{//甲戴红帽子,说假话
if(w==1)continue
}
//检验乙的说法
if(hat[1]){
if(w-1!=N-1)continue
}else{
if(w==N-1)continue
}
//检验丙的说法
if(hat[2]){
if(!(w-1==1&&hat[0]==0))continue
}else{
if(w==1&&hat[0]==0)continue
}
//检验丁的说法
if(hat[3]){
if(!(w-1==0))continue
}else{
if(w==0)continue
}
//检验戊的说法
if(hat[4]){
if(!(w-1==1&&hat[0]==0))continue
}//如果戊说了假话,其余情况都有可能
for(i=0i<N++i){
printf("%d ",hat[i])
}
printf("\n")
}
printf("\nFinished!\n")
局敬蚂 getch()
return 0
}
最后运行的结果显示为:0 0 1 0 1,即甲红、乙红、丙白、丁红、戊白。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)