猜凶手O.o

题目:

法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;
}

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值