A,B,C是小学教师,各教2门课,互不重复, 共有6门课:语文,算术,政治,地理,音乐和美术。已知:
(1)政治老师和算术老师是邻居。
(2)地理老师比语文老师年龄大。
(3)B最年轻。
(4)A经常对地理老师和算术老师讲他看过的文学作品。
(5)B经常和音乐老师,语文老师一起游泳。
请编程输出A B C各教哪两门课。
思路:
政治和算术不是同一个人教的。
B不教地理。
A不教地理或算术。
地理和算术不是同一个人教的。
音乐和语文不是同一个人教的。
B不教音乐和语文。
语文 | 算术 | 政治 | 地理 | 音乐 | 美术 | |
---|---|---|---|---|---|---|
A | × | × | ||||
B | × | × | × | √ | ||
C | √ |
下面分类讨论:
由于B必教美术,所以B的组合可能是算术+美术或政治+美术
(1)若B教算术+美术
语文 | 算术 | 政治 | 地理 | 音乐 | 美术 | |
---|---|---|---|---|---|---|
A | × | × | × | |||
B | × | √ | × | × | × | √ |
C | × | √ | × |
对C进行分类讨论:
(i)c:地理+语文
a:政治+音乐
(ii)c:地理+政治
a:语文+音乐(矛盾)
(iii)c:地理+音乐……
代码实现如下:
#include<iostream>
#include<cstring>
using namespace std;
struct teacher {
char name;
char c[20] = { 0 };
}t[3];
int main()
{
t[0].name = 'A';
t[1].name = 'B';
t[2].name = 'C';
int a, b, c, d, e, f;
for (a = 1; a <= 3; a++)
for (b = 1; b <= 3; b++)
for (c = 1; c <= 3; c++)
for (d = 1; d <= 3; d++)
for (e = 1; e <= 3; e++)
for (f = 1; f <= 3; f++)
{
if ((a + b + c + d + e + f == 12) && (a * b * c * d * e * f == 36))
{
if ((c != b) && (d != 2) && (d != 1) && (b != 1) && (d != b) && (e != a) && (e != 2) && (a != 2)&&(a!=d))
{
strcat_s(t[a - 1].c, "语文");
strcat_s(t[b - 1].c, "算数");
strcat_s(t[c - 1].c, "政治");
strcat_s(t[d - 1].c, "地理");
strcat_s(t[e - 1].c, "音乐");
strcat_s(t[f - 1].c, "美术");
for (int i = 0; i < 3; i++)
cout << t[i].name << "教" << t[i].c << endl;
}
}
}
return 0;
}
输出如图所示: