国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

藍橋杯——趣味邏輯推理一(2017.2.16)

2019-11-08 18:33:32
字體:
來源:轉載
供稿:網友

邏輯推理類問題:窮舉法+關系與邏輯運算符 綜合運用

1. 新郎和新娘

        三對情侶參加婚礼,三個新郞為A、B、C,三個新娘為X、Y、Z。有人不知道誰和誰結婚,于是詢問了六位新人中的三位,但聽到的回答是這樣的:A說他將和X結婚;X說她的未婚夫是C;C說他將和Z結婚。這人聽后知道他們在開玩笑,全是假話。請編程找出誰將和誰結婚。

【分析】可設三個新郎為x, y, z,窮舉所有情況;

        根據(jù)三句假話可推斷:x!='A'  x!='C'  z!='C',且根據(jù)ABC與XYZ的一一對應關系可知x!=y  y!=z  x!=z。這些條件需同時成立。

源代碼:

#include <stdio.h>int main(){	char x,y,z;                        //xyz分別為與新娘XYZ結婚的新郎 	for(x='A';x<='C';x++)              //三重循環(huán)窮舉所有可能情況 	{		for(y='A';y<='C';y++)		{			for(z='A';z<='C' && x!=y;z++)			{				if(x!='A' && x!='C' && z!='C' && x!=z && y!=z)  //三句假話+一個新郎只能與一個新娘結婚 					PRintf("%c-%c %c-%c %c-%c/n",x,'X',y,'Y',z,'Z'); 			}		}	}    return 0;}程序截圖:

2. 誰在說謊?

        現(xiàn)有張三、李四和王五三個人:

        張三說李四在說謊,

        李四說王五在說謊,

        而王五說張三和李四兩人都在說謊,

        要求編程求出這3個人中到底誰說的是真話,誰說的是假話。

【分析】

        題中邏輯條件:由于不知道三個人說的真與假,故有以下幾種可能情況:

        1. 張三真李四假或 張三假李四真(互反)

        2. 李四真王五假或 李四假王五真(互反)

        3. 王五真、張三李四均假  或  王五假、張三李四一真一假

        可設i, j, k分別為張三、李四、王五,真假分別用1和0表示,枚舉所有可能情況。

源代碼:

#include <stdio.h>int main(){	int i,j,k;                 //i-張三 j-李四 k-王五	for(i=0;i<=1;i++)          //1真0假 	{		for(j=0;j<=1;j++)		{			for(k=0;k<=1;k++)			{				if(((i&&!j)||(!i&&j)) && ((j&&!k)||(!j&&k)) && ((k&&!i&&!j) || !k&&(i+j!=0)))				{					printf("張三說的是%s/n",i?"真話":"假話");					printf("李四說的是%s/n",j?"真話":"假話");					printf("王五說的是%s/n",k?"真話":"假話");				}			}		}	}     return 0;}程序截圖:

3. 誰是竊贼

        警察審問四名竊贼嫌疑犯。已知,這四人當中僅有一名是竊贼,還知道這四個人中每人要么是誠實的,要么總是說謊。他們給警察的回答是:        甲說:“乙沒有偷,是丁偷的” ;        乙說:“我沒有偷,是丙偷的” ;        丙說:“甲沒有偷,是乙偷的”;        丁說:“我沒有偷”。

        請編寫程序,根據(jù)這四個人的回答判斷誰是竊贼。

【分析】可用變量ABCD分別代表甲乙丙丁四人,1和0分別代表該日是/不是竊贼,則可得出以下條件:

        B+D=1,B+C=1,A+B=1,A+B+C+D=1;

        由于甲乙丙三人的話中都提到了兩個人,其中必有一人是小偷,所以在根據(jù)他們的話列出條件表達式時可不必關心誰說的是真話誰說的是假話(丁的話陳述了一個“客觀條件”即四人中有僅有一名是竊贼,故無法判斷真假);

        可依次設ABCD為竊贼,代入前三個表達式相與后的表達式依次檢驗。

源代碼:

#include <stdio.h>int main(){	int i;	int A=1,B=0,C=0,D=0;             //假定A為竊賊(1000)  	for(i=1;i<=4;i++) 	{ 		if(B+D==1 && B+C==1 && A+B==1)			break;		else		{			if(i==1)                 //甲不是竊賊,測試乙是否是竊賊(0100) 				A=0,B=1;			if(i==2)                 //甲乙都不是竊賊,測試丙是否是竊賊(0010) 				B=0,C=1;			if(i==3)                 //甲乙丙都不是竊賊,測試丁是否是竊賊(0001)				C=0,D=1;		}	}	if(i==1)		printf("甲是竊賊/n");	if(i==2)		printf("乙是竊賊/n");	if(i==3)		printf("丙是竊賊/n");	if(i==4)		printf("丁是竊賊/n");    return 0;}程序截圖:

4. 委派任務

        某偵察隊接到一項緊急任務,要求在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也不去。        問應當讓哪幾個人去?

【分析】可用ABCDEF 6個變量分別表示這6個人,某個人被選定去完成任務對應1,否則對應0,因此可得以下6個表達式:

        A+B>=1,A+D!=2,A+E+F==2,B+C==0 || B+C==2(都去2,都不去0),C+D==1,D+E==0 || D==1(DE都不去 或 D去,E去不去均可)

        聯(lián)立求解即可。

源代碼:

#include <stdio.h>int main(){	int A,B,C,D,E,F;	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++)						{							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("A%s被選擇去完成任務/n",A?"":"未");								printf("B%s被選擇去完成任務/n",B?"":"未");								printf("C%s被選擇去完成任務/n",C?"":"未");								printf("D%s被選擇去完成任務/n",D?"":"未");								printf("E%s被選擇去完成任務/n",E?"":"未");								printf("F%s被選擇去完成任務/n",F?"":"未");										}						}					}				}			}		}	}    return 0;}程序截圖:


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 孝感市| 长丰县| 丁青县| 汝城县| 仲巴县| 开江县| 利津县| 竹北市| 昌黎县| 平谷区| 肃宁县| 乌兰浩特市| 巴林右旗| 西畴县| 水富县| 新兴县| 鄂伦春自治旗| 长海县| 和田市| 巨野县| 阳泉市| 靖州| 九江县| 西盟| 克山县| 汉寿县| 屏边| 新疆| 巫山县| 疏勒县| 隆化县| 开封县| 阿鲁科尔沁旗| 溧水县| 凤城市| 靖州| 大连市| 定远县| 赤壁市| 克拉玛依市| 北京市|