张老师的生日是哪一天?

64 views
Skip to first unread message

鑫乐

unread,
Nov 9, 2007, 11:33:05 PM11/9/07
to XinlePC
小明和小强都是张老师的学生,张老师的生日是 M 月 N 日,2 人都知道张老师的生日是下列 10 组中的一天,张老师把 M 值告诉了小明,

N 值告诉了小强,张老师问他们知道他的生日是那一天吗?
3月4日 3月5日 3月8日
6月4日 6月7日
9月1日 9月5日
12月1日 12月2日 12月8日
小明说:如果我不知道的话,小强肯定也不知道
小强说:本来我也不知道,但是现在我知道了
小明说:哦,那我也知道了
请根据以上对话推断出张老师的生日是哪一天?

--------------------------------------------------------------------------- -------------------


小明知道的 M 值,M 值对应的 N 集合
M N
3 {4, 5, 8}
6 {4, 7}
9 {1, 5}
12 {1, 2, 8}
小强知道的 N 值,N 值对应的 M 集合
N M
1 {9, 12}
2 {12}
4 {3, 6}
5 {3, 9}
7 {6}
8 {3, 12}


小明说:如果我不知道的话,小强肯定也不知道
如果小明的 M 值为 12,那么它对应的 N 集合中的元素不能满足"小强肯定也不知道"的条件。因为如果小强的 N 值为 2,那么小强肯定就

道 M 是 12。这样小明的 6、12 这两个 M 值被排除掉其对应的 N 集合也被排除。


排除的日期:
6.4
6.7
12.1
12.2
12.8


排除之后小明知道的 M 值,M 值对应的 N 集合
M N
3 {4, 5, 8}
9 {1, 5}
排除之后小强知道的 N 值,N 值对应的 M 集合
N M
1 {9}
4 {3}
5 {3, 9}
8 {3}


小强说:本来我也不知道,但是现在我知道了
由于小强已经知道日期了,所以他的 N 值对应的 M 集合肯定就只有一个元素。排除小强的 5 这个 N 值以及对应的 M 集合。


排除的日期:
3.5
9.5


排除之后小明知道的 M 值,M 值对应的 N 集合
M N
3 {4, 8}
9 {1}
排除之后小强知道的 N 值,N 值对应的 M 集合
N M
1 {9}
4 {3}
8 {3}


小明说:哦,那我也知道了
小明知道的就是 9 月 1 日这个日期。

鑫乐

unread,
Dec 3, 2007, 8:06:02 AM12/3/07
to XinlePC
蹩脚程序解法。。。

#include <iostream>
#include <iomanip>
using namespace std;
#define M 4
#define N 6
int _tmain(int argc, _TCHAR* argv[])
{
int m[M] = { 3, 6, 9, 12 };
int n[N] = { 1, 2, 4, 5, 7, 8 };

int xm[M][3] = {
{2, 3, 5},
{2, 4, -1},
{0, 3, -1},
{0, 1, 5 }
};
int xq[N][3] = {
{2, 3, -1},
{3, -1, -1},
{0, 1, -1},
{0, 2, -1},
{1, -1, -1},
{0, 3, -1}
};

// 小明说:如果我不知道的话,小强肯定也不知道。
int h[N] = { -1, -1, -1, -1, -1, -1 };
int c = 0;
for (int i = 0; i < N; ++i)
{
int* q = xq[i];
if (q[1] < 0)
{
h[c] = q[0];
++c;
}
}
for (int i = 0; i < c; ++i)
{
int k = h[i];
int* x = xm[k];
for (int j = 0; j < 3; ++j)
{
if (x[j] < 0)
break;
int* q = xq[x[j]];
x[j] = -1;
for (int l = 0; l < 3; ++l)
{
if (q[l] == k)
{
q[l] = -1;
break;
}
}
}
}
// 小强说:本来我也不知道,但是现在我知道了。
for (int i = 0; i < N; ++i)
{
int* q = xq[i];
if (q[1] > 0)
{
int k = i;
for (int j = 0; j < M; ++j)
{
int* x = xm[j];
for (int l = 0; l < 3; ++l)
{
if (x[l] == k)
{
x[l] = -1;
break;
}
}
}
}
}

// 小明说:哦,那我也知道了。
int i, j, a;
for (i = 0; i < M; ++i)
{
int* x = xm[i];
a = j = 0;
for (int l = 0; l < 3; ++l)
{
if (x[l] >= 0)
{
++a;
j = l;
}
}
if (a == 1)
break;
}
if (a != 1)
{
cout << "无解!" << endl;
}
else
{
cout << "某老师的生日是:" << m[i] << "月" << n[j] << "日" << endl;
}


system("pause");
return 0;
}

Reply all
Reply to author
Forward
0 new messages