注册 登录
编程论坛 C++教室

来关心关心女老师。

yangfrancis 发布于 2017-05-28 21:37, 3235 次点击
五位女教师:
谷老师不是二年级老师
爱欣是美术老师
王老师是音乐老师
晓宁不是数学老师
李老师不是四年级老师
瑞英教一年级学生
芸菲是语文老师
刘老师是英语老师
芸菲不教三年级
高老师教五年级
莹莹教四年级

问:每一位老师全名及教哪一年级哪一门课
挺有意思的,供大家练练手。
7 回复
#2
rjsp2017-05-31 12:41
结果太多了
程序代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main( void )
{
    string family_names[] = { "", "", "", "", "" };
    string given_names[] = { "瑞英", "芸菲", "莹莹", "爱欣", "晓宁" };
    string grade_names[] = { "一年级", "二年级", "三年级", "四年级", "五年级" };
    string subject_names[] = { "语文", "数学", "英语", "美术", "音乐" };

    auto grade_with_familyname = [&]( const char* family_name ) { return grade_names[distance(begin(family_names),find(begin(family_names),end(family_names),family_name))]; };
    auto grade_with_givenname = [&]( const char* given_name ) { return grade_names[distance(begin(given_names),find(begin(given_names),end(given_names),given_name))]; };
    auto subject_with_familyname = [&]( const char* family_name ) { return subject_names[distance(begin(family_names),find(begin(family_names),end(family_names),family_name))]; };
    auto subject_with_givenname = [&]( const char* given_name ) { return subject_names[distance(begin(given_names),find(begin(given_names),end(given_names),given_name))]; };

    sort( begin(given_names), end(given_names) );
    do
    {
        sort( begin(grade_names), end(grade_names) );
        do
        {
            sort( begin(subject_names), end(subject_names) );
            do
            {
                if( grade_with_familyname("") != "二年级"
                    && subject_with_givenname("爱欣") == "美术"
                    && subject_with_familyname("") == "音乐"
                    && subject_with_givenname("晓宁") != "数学"
                    && grade_with_familyname("") != "四年级"
                    && grade_with_givenname("瑞英") == "一年级"
                    && subject_with_givenname("芸菲") == "语文"
                    && subject_with_familyname("") == "英语"
                    && grade_with_givenname("芸菲") != "三年级"
                    && grade_with_familyname("") == "五年级"
                    && grade_with_givenname("莹莹") == "四年级" )
                {
                    cout << family_names[0] << given_names[0] << grade_names[0] << subject_names[0] << '\n'
                         << family_names[1] << given_names[1] << grade_names[1] << subject_names[1] << '\n'
                         << family_names[2] << given_names[2] << grade_names[2] << subject_names[2] << '\n'
                         << family_names[3] << given_names[3] << grade_names[3] << subject_names[3] << '\n'
                         << family_names[4] << given_names[4] << grade_names[4] << subject_names[4] << '\n' << endl;
                }
            }
            while( next_permutation(begin(subject_names),end(subject_names)) );
        }
        while( next_permutation(begin(grade_names),end(grade_names)) );
    }
    while( next_permutation(begin(given_names),end(given_names)) );
}

输出
李爱欣二年级美术
谷瑞英一年级数学
高芸菲五年级语文
王晓宁三年级音乐
刘莹莹四年级英语

李爱欣三年级美术
谷瑞英一年级数学
高芸菲五年级语文
王晓宁二年级音乐
刘莹莹四年级英语

李爱欣二年级美术
谷瑞英一年级数学
高芸菲五年级语文
王莹莹四年级音乐
刘晓宁三年级英语

李爱欣三年级美术
谷瑞英一年级数学
高芸菲五年级语文
王莹莹四年级音乐
刘晓宁二年级英语

李爱欣二年级美术
谷莹莹四年级数学
高芸菲五年级语文
王瑞英一年级音乐
刘晓宁三年级英语

李爱欣三年级美术
谷莹莹四年级数学
高芸菲五年级语文
王瑞英一年级音乐
刘晓宁二年级英语

李爱欣二年级美术
谷莹莹四年级数学
高芸菲五年级语文
王晓宁三年级音乐
刘瑞英一年级英语

李爱欣三年级美术
谷莹莹四年级数学
高芸菲五年级语文
王晓宁二年级音乐
刘瑞英一年级英语

李瑞英一年级数学
谷爱欣三年级美术
高芸菲五年级语文
王晓宁二年级音乐
刘莹莹四年级英语

李瑞英一年级数学
谷爱欣三年级美术
高芸菲五年级语文
王莹莹四年级音乐
刘晓宁二年级英语

李芸菲二年级语文
谷瑞英一年级数学
高爱欣五年级美术
王晓宁三年级音乐
刘莹莹四年级英语

李芸菲二年级语文
谷瑞英一年级数学
高爱欣五年级美术
王莹莹四年级音乐
刘晓宁三年级英语

李芸菲二年级语文
谷莹莹四年级数学
高爱欣五年级美术
王瑞英一年级音乐
刘晓宁三年级英语

李芸菲二年级语文
谷莹莹四年级数学
高爱欣五年级美术
王晓宁三年级音乐
刘瑞英一年级英语

#3
malong6562017-05-31 23:00
问下大大,include前3行<>这里为什么要加这几个英文。我刚刚学习的,突然发现看不懂了
#4
sharplong2017-05-31 23:25
厉害呀,各位大佬
#5
sharplong2017-05-31 23:26
回复 3楼 malong656
头文件呀
#6
yangfrancis2017-06-01 13:55
回复 2楼 rjsp
多谢关注。我写的时候只找了一种解法,真要完全遍历的话符合条件的解法是很多的。再次感觉到了algorithm的强大福利
#7
yangfrancis2017-06-01 13:55
#include<stdio.h>
#include<algorithm>
using namespace std;

short surname[5]={0,1,2,3,4};//从0~4分别为谷,王,李,刘,高
short name[5]={0,1,2,3,4};//从0~4分别为爱欣,晓宁,瑞英,芸菲,莹莹
short crs[5]={0,1,2,3,4};//从0~4分别为美术,音乐,数学,语文,英语
short grade[5]={0,1,2,3,4};//从0~4分别为一到五年级
bool JudgeCourse()  //符合返回真
{
    for(short i=0;i<5;i++)
    {
        if((name[i]==0)!=(crs[i]==0)) return false;   //爱欣是美术老师
        if((surname[i]==1)!=(crs[i]==1)) return false;//王老师是音乐老师
        if(name[i]==1&&crs[i]==2) return false;       //晓宁不是数学老师
        if((name[i]==3)!=(crs[i]==3)) return false;   //芸菲是语文老师
        if((surname[i]==3)!=(crs[i]==4)) return false;//刘老师是英语老师
    }
    return true;
}
bool JudgeGrade()  //符合返回真
{
    for(short i=0;i<5;i++)
    {
        if(surname[i]==0&&grade[i]==1) return false;  //谷老师不是二年级老师
        if(surname[i]==2&&grade[i]==3) return false;  //李老师不是四年级老师
        if((name[i]==2)!=(grade[i]==0)) return false;  //瑞英教一年级学生
        if(name[i]==3&&grade[i]==2) return false;  //芸菲不教三年级
        if((surname[i]==4)!=(grade[i]==4)) return false;//高老师教五年级
        if((name[i]==4)!=(grade[i]==3)) return false;//莹莹教四年级
    }
    return true;
}
int main()
{
    bool success=false;
    do
    {
        for(short icrs=0;icrs<5;icrs++) crs[icrs]=icrs;
        do
        {
            if(!JudgeCourse()) continue;
            for(short igrade=0;igrade<5;igrade++) crs[igrade]=igrade;
            do
            {
                if(JudgeGrade())success=true;
            }while(!success&&next_permutation(grade,grade+5));
        }while(!success&&next_permutation(crs,crs+5));
    }while(!success&&next_permutation(name,name+5));
    for(short i=0;i<5;i++)
    {
        switch(surname[i])
        {
        case 0:printf("%s","谷");break;
        case 1:printf("%s","王");break;
        case 2:printf("%s","李");break;
        case 3:printf("%s","刘");break;
        default:printf("%s","高");break;
        }
        switch(name[i])
        {
        case 0:printf("%s","爱欣老师教");break;
        case 1:printf("%s","晓宁老师教");break;
        case 2:printf("%s","瑞英老师教");break;
        case 3:printf("%s","芸菲老师教");break;
        default:printf("%s","莹莹老师教");break;
        }
        switch(grade[i])
        {
        case 0:printf("%s","一年级");break;
        case 1:printf("%s","二年级");break;
        case 2:printf("%s","三年级");break;
        case 3:printf("%s","四年级");break;
        default:printf("%s","五年级");break;
        }
        switch(crs[i])
        {
        case 0:printf("%s","美术\n");break;
        case 1:printf("%s","音乐\n");break;
        case 2:printf("%s","数学\n");break;
        case 3:printf("%s","语文\n");break;
        default:printf("%s","英语\n");break;
        }
    }
    return 0;
}
#8
随风晨爱2017-06-01 17:38
好牛逼啊。。。
1