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