循环嵌套的综合应用(二)

知识目标

    回顾循环嵌套的综合应用

学习目标

    熟练应用循环嵌套

一讲

课外活动

问题描述:

现有一项课外活动需要 A,B,C,D,E 五人去完成。已知在完成此项任务时

有以下条件限制:

1. A ,C 不能都去;

2. B ,C 不能都不去;

3. 如果 C 去了,D、E 必须去并且只能去一个;

4. B,C,D 不能都去;

5. 如果 B 去了,D、E 不能都去。

现在需要你编程找到所有符合条件的人员组合。

样例输出:

    0 0 1 0 1

    0 0 1 1 0

    0 1 0 0 0

    0 1 0 0 1

    0 1 0 1 0

    0 1 1 0 1

    1 1 0 0 0

    1 1 0 0 1

    1 1 0 1 0

过程分析:

1.   我们用 a,b,c,d,e 来表示五人的状态,用 0 ,1 来枚举状态: 1 表示去, 0 表示 不去。则穷举情况如下:

 

 2.   使用 a,b,c,d,e 进行条件模拟如下

 完整代码:

#include <iostream>
using namespace std;
int main(){
    int a,b,c,d,e;
    for(int a=0;a<=1;a++)
        for(int b=0;b<=1;b++)
            for(int c=0;c<=1;c++)
                for(int d=0;d<=1;d++)
                    for(int e=0;e<=1;e++)
                        if(!(a&&c)&&(b||c)&&((c&&(d&&!e||!d&&e))||!c)
                        &&!(b&&c&&d)&&(b&&(!(d&&e))||!b)) 
                            cout<<a<<“ ”<<b<<“ ”<<c<<“ ”<<d<<“ ”<<e<<endl;
    return 0;
}

侦探柯南

问题描述:

柯南在调查一起盗窃案件时,对涉及到的四名嫌疑人 A ,B, C, D 进行

了审问。四人供述如下:

A :罪犯在 B, C, D 三人中;

B 我没作案,是 C 干的;

C A 和 D 有一个是罪犯;

D :B 说的对;

经过充分论证,可以确定四人中只有两人说了真话,且罪犯只有一人。请你写一段程序来帮助好朋友柯南确定几名嫌疑人的身份。

样例输出:

0 0 0 1

思维过程:

代码如下:

int a=0,b=0,c=0,d=0,l1=0,l2=0,l3=0,l4=0; 
for(a=0;a<=1;a++) 
    for(b=0;b<=1;b++)
        for(c=0;c<=1;c++)
            for(d=0;d<=1;d++){
                l1=(b+c+d==1);
                l2=(!b&&c);
                l3=(a+d==1);
                l4=l2;
                if(l1+l2+l3+l4==2&&a+b+c+d==1) 
                    cout<<a<<" "<<b<<" "<<c<<" "<<d;}

三国狼人

问题描述:

三国时期,刘,关,张,赵四人闲来无事决定一起玩狼人杀。已知牌面有三种身份:狼人、强盗和平民。他们请来孔明做法官,第一夜之后,孔明已经知道四人当中有两个平民,其余两人为强盗和狼人。四人开始发言:

刘:张是强盗,赵是狼人

:刘是强盗;

关:强盗和狼人在刘和张当中,但不确定具体身份;

赵:强盗和狼人在关和张当中,但不确定具体身份;

孔明善于识人,看出四人当中有两人撒谎了。请你来编程帮孔明列出四人身份的所 情况。

要求:用 a ,b ,c ,d 来表示四人编号,用0,1,2 来枚举平民,狼人,强盗三种身份。输出顺序为:刘备,关羽,张飞,赵云。

输出格式:

2 0 1 0

思维过程:

a,b,c,d分别表示刘、关、张、赵。0表示平民,1表示狼人,2表示强盗。
使用l1,l2,l3,l4表示四人说话的真伪性,模拟条件如下:

 整代码:

#include<iostream> 
using namespace std; 
int main(){ 
	int a,b,c,d,l1,l2,l3,l4;
	for(a=0;a<=2;a++){
	    for(b=0;b<=2;b++){
	        for(c=0;c<=2;c++){
	            for(d=0;d<=2;d++){
	                l1=(c==2&&d==1);
	                l2=(a+c==3);
	                l3=(a==2);
	                l4=(b+c==3);
	                if(l1+l2+l3+l4==2&&a+b+c+d==3){
	                    cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
	                }
	            }
	        }
	    }
	}
}

创作不易,请多多鼓励!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值