题目:
法1: 我们有一个基本思路: 其中只有一个人说假话,如果我们找到的那个假话的人,然后取反,将取反的话作为该人的话。那么此时这四个人的话都是真话,因此此时这是个人同时指向的那个人即是凶手(即有一个人出现在这四个人的话中)
对元素的初始化: 其中ARR为对每个人的话进行取反时运用的。 【Arr,Brr,Crr,Drr分别为A,B,C,D说的话】 BEI为后文进行一次判断后,作用为:将上一次判断中取假的数组还原
char ARR[L] = "abcd";
char Arr[L] = "0bcd";
char Brr[L] = "00c0";
char Crr[L] = "000d";
char Drr[L] = "abc0";
char BEI[L] = "0000";
取假的结果(Eg:Arr假的时候则为:"a000")
int MaoPai(char*pa, char*pb)//确定非,,,即a假则a表示 a
{
for (int i = 0; i < L-1; i++)
{
if (*(pb + i) == '0')
{
*(pb + i) = *(pa + i);
}
else
{
*(pb + i) = '0';
}
}
return 1;
}
判断两个人说的话是否有相同的元素
int Xiang(char* pm, char* pn)//判断相等
{
int num = 0;
for (int i = 0; i < L - 2; i++)
{
if (*(pm + i) == *(pn + i)&&*(pm+i)!='0' && *(pn + i) != '0')
{
num++;
}
}
if (num > 0)
return 1;
else
return 0;
}
当其中一个为假的时候,判断其他三个是否有共同元素,若有则进入判断输出
void Pan(char ARR[L], char Arr[L], char Brr[L], char Crr[L], char Drr[L])//判断
{
if (MaoPai(ARR, Arr))
{
if (Xiang(Brr, Crr) > 0 && Xiang(Crr, Drr) > 0 && Xiang(Brr, Drr))
{
Put(Brr, Crr, Drr,Arr);
}
}
}
判断输出,当此时4个数组 的元素都相同时,该元素即为凶手
void Put(char* pa, char* pb, char* pc,char* pd)//输出
{
for (int i = 0; i < L - 2; i++)
{
if (*(pa + i) != 0)
{
if ((*(pa + i) == *(pb + i) )&& (*(pa + i) == *(pc + i)) && (*(pb + i) == *(pc + i))&&(*(pa+i)==*(pd+i)))
{
printf("凶手是:%c \n", *(pc + i));
}
}
}
}
拷贝与还原数组 【BEIFEN0是拷贝数组,BEIFEN1是还原数组】
void BEIFEN0(char BEI[L], char Arr[L])//拷贝
{
for (int i = 0; i < L; i++)
{
BEI[i] = Arr[i];
}
}
void BEIFEN1(char BEI[L], char Arr[L])//还原
{
for (int i = 0; i < L; i++)
{
Arr[i] = BEI[i];
}
}
主函数:
int main()
{
char ARR[L] = "abcd";
char Arr[L] = "0bcd";
char Brr[L] = "00c0";
char Crr[L] = "000d";
char Drr[L] = "abc0";
char BEI[L] = "0000";
BEIFEN0(BEI, Arr);
Pan(ARR, Arr, Brr, Crr, Drr);//A为假话时进行判断
BEIFEN1(BEI, Arr);
BEIFEN0(BEI, Brr);
Pan(ARR, Brr, Arr, Crr, Drr);//B为假话时进行判断
BEIFEN1(BEI, Brr);
BEIFEN0(BEI, Crr);
Pan(ARR, Crr, Arr, Brr, Drr);//C为假话时进行判断
BEIFEN1(BEI, Crr);
BEIFEN0(BEI, Drr);
Pan(ARR, Drr, Arr, Brr, Crr);//D为假话时进行判断
BEIFEN1(BEI, Drr);
return 0;
}
法2:刚刚我们是从正面出发的,而我们现在可以从反面进行思考,如果我们进行试验凶手,只有假设为真的时候,这4个人的话才会符合只有一个人为假,其他均为真
代码如下: 其中 if 是判断那个符合只有一个人说的话为假,其他3个人说的话为真
#include<stdio.h>
int main()
{
char n;
for (n = 'A'; n <= 'D'; n++)//依次试验是否为凶手
{
if ((n != 'A') + (n == 'C') + (n == 'D') + (n != 'D') == 3)
{
printf("凶手为:%c ", n);
}
}
return 0;
}