C语言疑案求解

@疑案求解

分别用循环和位运算解决

#include<stdio.h>
#include<string.h>
/*
---------------------------------------------
六个嫌疑人,找出作案人。
1)A和B至少有一个人作案
2)A和D不可能是同案犯
3)A E F至少有两人参与作案
4)B C或同时作案,或与本案无关
5)C D中有且只有一人作案
6)如果D没有作案,则E也不能参与作案
--------------------------------------------
*/
void sol1(char (*)[9]);//六重循环
void sol2(char(*)[9]);//位运算
void main()
{
	char str[2][9] = { "没有作案", "作案" };
	sol2(str);
}
void sol1(char (*str)[9])
{
	int t1, t2, t3, t4, t5, t6;
	int T;
	int A, B, C, D, E, F;//代表嫌疑人
	for (A = 0; A <= 1; A++)//A=1为作案
	{
		for (B = 0; B <= 1; B++)
		{
			for (C = 0; C <= 1; C ++ )
			{
				for (D = 0; D <= 1; D++)
				{
					for (E = 0; E <= 1; E++)
					{
						for (F = 0; F <= 1;F++)
						{
							t1 = A||B;
							t2 = !(A&&D);
							t3 = (A&&E) || (A&&F) || (F&&E);
							t4 = (B&&C) || (!B&&!C);
							t5 = (D&&!C) || (!D&&C);
							//t6 =D||(!E)
							t6 = (!D&&!E) || (D&&E) || (D&&!E);
							T = t1 + t2 + t3 + t4 + t5 + t6;
							if (T == 6)
							{
								printf_s("A : %s \n", str[A]);
								printf_s("B : %s \n", str[B]);
								printf_s("C : %s \n", str[C]);
								printf_s("D : %s \n", str[D]);
								printf_s("E : %s \n", str[E]);
								printf_s("F : %s \n", str[F]);
							}
						}
					}
				}
			}
		}
	}
}
void sol2(char(*str)[9])
{
	int t1, t2, t3, t4, t5, t6;
	int T;
	int A, B, C, D, E, F;//代表嫌疑人,把他们看成二进制的位,F位最低位
	for (int i = 0; i <= 63; i++)//2的六次方个排列数
	{
		F = (i & 1);
		E = (i & 2) >> 1;
		D = (i & 4) >> 2;
		C = (i & 8) >> 3;
		B = (i & 16) >> 4;
		A = (i & 32) >> 5;

		t1 = A || B;
		t2 = !(A&&D);
		t3 = (A&&E) || (A&&F) || (F&&E);
		t4 = (B&&C) || (!B&&!C);
		t5 = (D&&!C) || (!D&&C);
		//t6 =D||(!E)
		t6 = (!D&&!E) || (D&&E) || (D&&!E);
		T = t1 + t2 + t3 + t4 + t5 + t6;
		if (T == 6)
		{
			printf_s("A : %s \n", str[A]);
			printf_s("B : %s \n", str[B]);
			printf_s("C : %s \n", str[C]);
			printf_s("D : %s \n", str[D]);
			printf_s("E : %s \n", str[E]);
			printf_s("F : %s \n", str[F]);
		}
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

madkeyboard

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值