穷举以上所有可能的情况,代入上述表达式中进行推理运算,若假设的情况使上述表达式的结果均为真,则假设情况就是正确的结果。 *程序说明与注释 #include
int x,y,z;
for(x=1;x<=3;x++) /*穷举x的全部可能配偶*/ for(y=1;y<=3;y++) /*穷举y的全部可能配偶*/ for(z=1;z<=3;z++) /*穷举z的全部可能配偶*/
if(x!=1&&x!=3&&z!=3&&x!=y&&x!=z&&y!=z) /*判断配偶是否满足题意*/ {
printf(\打印判断结果*/ printf(\printf(\} }
*运行结果
X will marry to B. (X与B结婚) Y will marry to C. (Y与C结婚) Z will marry to A. (Z与A结婚)
38.委派任务
某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件:
1)A和B两人中至少去一人; 2)A和D不能一起去;
3)A、E和F三人中要派两人去; 4)B和C都去或都不去; 5)C和D两人中去一个; 6)若D不去,则E也不去。 问应当让哪几个人去? *问题分析与算法设计
用A、B、C、D、E、F六个变量表示六个人是否去执行任务的状态,变量的值为1,则表示该人去;变量的值为0,则表示该人不参加执行任务,根据题意可写出表达式: a+b>1 A和B两人中至少去一人; a+d!=2 A和D不能一起去;
a+e+f==2 A、E、F三人中要派两人去; b+c==0或b+c==2 B和C都去或都不去; c+d==1 C和D两人中去一个;
d+e==0或d==1 若D不去,则E也不去(都不去;或D去E随便)。
上述各表达式之间的关系为“与”关系。穷举每个人去或不去的各种可能情况,代入上述表达式中进行推理运算,使上述表达式均为“真”的情况就是正确的结果。 *程序说明与注释 #include
int a,b,c,d,e,f;
for(a=1;a>=0;a–) /*穷举每个人是否去的所有情况*/ for(b=1;b>=0;b–) /*1:去 0:不去*/ for(c=1;c>=0;c–) for(d=1;d>=0;d–) for(e=1;e>=0;e–) for(f=1;f>=0;f–)
if(a+b>=1&&a+d!=2&&a+e+f==2 &&(b+c==0||b+c==2)&&c+d==1 &&(d+e==0||d==1)) {
printf(\printf(\printf(\printf(\printf(\printf(\} }
*运行结果
A will be assigned. (去) B will be assigned. (去) C will be assigned. (去) D will not be assigned. (不去) E will not be assigned. (不去) F will be assigned. (去) *思考题
某参观团按以下条件限制从A、B、C、D、E五个地方中选若干参观点: 1)如去A,则必须去B; 2)D、E两地只能去一地; 3)B、C两地只能去一地; 4)C、D两地都去或都不去; 5)若去E地,A、D也必去。 问该团最多能去哪几个地方?
39.谁在说谎
张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。现在问:这三人中到底谁说的是真话,谁说的是假话? *问题分析与算法设计
分析题目,每个人都有可能说的是真话,也有可能说的是假话,这样就需要对每个人所说的话进行分别判断。假设三个人所说的话的真假用变量A、B、C表示,等于1表示该人说的是真话; 表示这个人说的是假话。由题目可以得到:
*张三说李四在说谎 张三说的是真话:a==1&&b==0 或 张三说的是假话:a==0&&b==1
*李四说王五在说谎 李四说的是真话:b==1&&c==0 或 李四说的是假话:b==0&&c==1
*王五说张三和李四都在说谎 王五说的是真话:c==1&&a+b==0 或 王五说的是假话:c==0&&a+b!=0
上述三个条件之间是“与”的关系。将表达式进行整理就可得到C语言的表达式: (a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0)
穷举每个人说真话或说假话的各种可能情况,代入上述表达式中进行推理运算,使上述表达式均为“真”的情况就是正确的结果。 *程序说明与注释 #include
int a,b,c; for(a=0;a<=1;a++) for(b=0;b<=1;b++) for(c=0;c<=1;c++)
if((a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0)) {
printf(\printf(\printf(\} }
*运行结果
Zhangsan told a lie (张三说假话) Lisi told a truch. (李四说真话) Wangwu told a lie. (王五说假话)
40.谁是窃贼
公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的。在回答公安人员的问题中: 甲说:―乙没有偷,是丁偷的。‖ 乙说:―我没有偷,是丙便的。‖
丙说:―甲没有偷,是乙偷的。‖ 丁说:―我没有偷。‖
请根据这四人的答话判断谁是盗窃者。 *问题分析与算法设计
假设A、B、C、D分别代表四个人,变量的值为1代表该人是窃贼。
由题目已知:四人中仅有一名是窃贼,且这四个人中的每个人要么说真话,要么说假话,而由于甲、乙、丙三人都说了两句话:―X没偷,X偷了‖,故不论该人是否说谎,他提到的两人中必有一人是小偷。故在列条件表达式时,可以不关心谁说谎,谁说实话。这样,可以列出下列条件表达式:
甲说:‖乙没有偷,是丁偷的。‖ B+D=1 乙说:―我没有偷,是丙偷有。‖ B+C=1 丙说:―甲没有偷,是乙偷的。‖ A+B=1 丁说:―我没有偷。‖ A+B+C+D=1
其中丁只说了一句话,无法判定其真假,表达式反映了四人中仅有一名是窃贼的条件。 *程序说明与注释 #include
int i,j,a[4];
for(i=0;i<4;i++) /*假定只有第i个人为窃贼*/ {
for(j=0;j<4;j++) /*将第i个人设置为1表示窃贼,其余为0*/ if(j==i)a[j]=1; else a[j]=0;
if(a[3]+a[1]==1&&a[1]+a[2]==1&&a[0]+a[1]==1) /*判断条件是否成立*/ {
printf(\成立*/ for(j=0;j<=3;j++) /*输出计算结果*/ if(a[j])printf(\printf(\} } }
*运行结果
The thief is B. (乙为窃贼。)
41.拉丁方阵
构造 NXN 阶的拉丁方阵(2<=N<=9),使方阵中的每一行和每一列中数字1到N只出现一次。如N=4时: 1 2 3 4 2 3 4 1
3 4 1 2 4 1 2 3
*问题分析与算法设计
构造拉丁方阵的方法很多,这里给出最简单的一种方法。观察给出的例子,可以发现:若将每 一行中第一列的数字和最后一列的数字连起来构成一个环,则该环正好是由1到N顺序构成;对于第i行,这个环的开始数字为i。按照 此规律可以很容易的写出程序。下面给出构造6阶拉丁方阵的程序。 *程序说明与注释 #include
int i,j,k,t;
printf(\for(j=0;j for(i=0;i t=(i+j)%N; /*确定该拉丁方阵第i 行的第一个元素的值*/ for(k=0;k printf(\} } *运行结果 The possble Latin Squares of order 6 are: 1 2 3 4 5 6 2 3 4 5 6 1 3 4 5 6 1 2 2 3 4 5 6 1 3 4 5 6 1 2 4 5 6 1 2 3 3 4 5 6 1 2 4 5 6 1 2 3 5 6 1 2 3 4 4 5 6 1 2 3 5 6 1 2 3 4 6 1 2 3 4 5 5 6 1 2 3 4 6 1 2 3 4 5 1 2 3 4 5 6 6 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 1 4 5 6 1 2 3 5 6 1 2 3 4 6 1 2 3 4 5 5 6 1 2 3 4 6 1 2 3 4 5 1 2 3 4 5 6 6 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 1 1 2 3 4 5 6 2 3 4 5 6 1 3 4 5 6 1 2 2 3 4 5 6 1 3 4 5 6 1 2 4 5 6 1 2 3 3 4 5 6 1 2 4 5 6 1 2 3 5 6 1 2 3 4 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库c语言趣味题(7)在线全文阅读。
相关推荐: