集中处理之逻辑问题

      逻辑问题求解:核心思想方法是枚举求解,类似枚举求解的问题就应该交给计算机来求解,因为计算机最不怕做的事情就是循环。

1.
某班有四位同学,其中的一位恶作剧,但是谁都不承认.
A说:不是我;
B说:是C;
C说:是D;
D说:C胡说.
已知其中三个人说的是真话,1个人说的是假话.编写程序根据这些信息,找出恶作剧的同学.

 

//book code 
# include <stdio.h>

int main(void)
{
 int k,sum;
 char thisman;
 
 for (k=0; k<=3; k++)
 {
  thisman = 65+k;
  sum = (thisman!='A') + (thisman=='C') + (thisman=='D') + (thisman!='D');
  if (sum==3)
  {
   printf("This man is %c\n", thisman);
   break;
  }
 }
 return 0;
}
//my code
# include <stdio.h>

int main(void)
{
 int i,sum;

 for (i=1; i<=4; i++)
 {
  sum = (i!=1) + (i==3) + (i==4) + (i!=4);
  if (sum==3)
  {
   printf("This man is %c\n", i+'A'-1);
   break;
  }

 }

 return 0;
}

 


2.
某刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:
 1)A、B 至少有一人作案; 2)A、E、F 三人中至少有两人参与作案; 3)A、D 不可能是同案犯;
 4)B、C 或同时作案,或与本案无关;5)C、D 中有且仅有一人作案;6)如果 D 没有参与作案,则 E 也不可能参与作案。
 请你试编一程序,将作案人找出来。

# include <stdio.h>

int main(void)
{
	int a, b, c, d, e, f;
	int x1, x2, x3, x4, x5, x6;
//枚举每个人的可能性:0--表示不是罪犯: 1--表示是罪犯。
	for (a=0; a<=1; a++)
		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++)
						{
							x1 = 1 - (!a && !b);//a||b;
							x2 = (a&&e) || (a&&f) || (e&&f);
							x3 = !(a&&d);
							x4 = (b&&c) || (!a&&!b);
							x5 = (c&&!d) || (d&&!c);
							x6 = (!d&&!e) || d;
							if (x1+x2+x3+x4+x5+x6==6)
							{
								printf("%d %d %d %d %d %d\n", a, b, c, d, e, f);
							}
						}

	return 0;
}
 /*
 在vc++6.0中的输出结果是:
 1 1 1 0 0 1
Press any key to continue
 */


 3.
3个人比饭量大,每个人说了两句话。
A说:B比我吃得多,C和我吃得一样多。
B说:A比我吃得多,A也比C吃得多。
C说:我比B吃得多,B比A吃得多。

事实上饭量越小的人讲对的话越多。

请编程输出3个人饭量。

# include <stdio.h>

int main(void)
{
	int a, b, c;
	int x1, x2, x3;
    //数字越大表示饭量越大
	for (a=1; a<=3; a++)
		for (b=1; b<=3; b++)
			for (c=1; c<=3; c++)
			{
				x1 = (b>a) + (a==c);
				x2 = (a>b) + (a>c);
				x3 = (c>b) + (b>a);
				if (  !(a>=b&&x1>=x2)
					&&!(a>=c&&x1>=x3)
					&&!(b>=c&&x2>=x3)
					&&!(b>=a&&x2>=x1)
					&&!(c>=a&&x3>=x1)
					&&!(c>=b&&x3>=x2) )
					printf("A=%d,B=%d,C=%d\n", a, b, c);
					
			}

	return 0;
}
/*
在vc++6.0中的输出结果是:
A=3,B=1,C=2
Press any key to continue

*/

根据提议,饭量越小的人讲对的话越多。

即:不存在两个人,其中一个人的饭量比另一个人小,且说对的话不比另一个人多。
当变量A、B、C满足这个条件时,就可以输出这组解了。
 if (!((A>=B)&&(As>=Bs)||(A>=C)&&(As>=Cs)

       ||(B>=C)&&(Bs>=Cs)||(B>=A)&&(Bs>=As)

       ||(C>=A)&&(Cs>=As)||(C>=B)&&(Cs>=Bs)))

因为有两个变量,所以该想法和我的想法一样,只不过表达形式有差别,实质都是一样的,
六件事情都不发生等价于(1-六件事情任意若干件发生),等价于!(六件事情任意若干件发生)。


4.
两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.以抽签决定比赛名单.有人向队员打听
比赛的名单.a说他不与x比,c说他不与x和z比.请编程找出三对赛手的名单.

//this is my code
# include <stdio.h>

int main(void)
{
	char i, j, k;//i是a的对手,j是b的对手,k是c的对手
	for (i='x'; i<='z'; i++)
		for (j='x'; j<='z'; j++)
			for (k='x'; k<='z'; k++)
			{
				if (i!='x' && (k!='x'&&k!='z') && i!=j && i!=k && j!=k)
					printf("order is a--%c\tb--%c\tc--%c\n", i, j, k);
			}

	return 0;
}
//或者更简便的
# include <stdio.h>

int main(void)
{
	int i, j, k;//i是a的对手,j是b的对手,k是c的对手
	for (i=1; i<=3; i++)
		for (j=1; j<=3; j++)
			for (k=1; k<=3; k++)
			{
				if (i!=1 && (k!=1&&k!=3) && i!=j && i!=k && j!=k)
					printf("order is a--%c\tb--%c\tc--%c\n", 'w'+i, 'w'+j, 'w'+k);
			}

	return 0;
}

//this is the books code
# include <stdio.h>

int main(void)
{
	char i, j, k;
	for (i='x'; i<='z'; i++)
		for (j='x'; j<='z'; j++)
		{
			if(i!=j)
			for (k='x'; k<='z'; k++)
			{
				if(i!=k && j!=k)
					if (i!='x' && (k!='x'&&k!='z') )
						printf("order is a--%c\tb--%c\tc--%c\n", i, j, k);		
			}
		}

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值