[笔记]震惊!一道难的令人发指的推理题,电脑只用了几十毫秒就算出答案!
本帖最后由 wushaominkk 于 2018-3-20 10:42 编辑这个也算是一个老题目了
看了后,花了不少时间仍然没解出来
题目的图片:
后来就用易语言,写了个小程序
运行后,我震惊了!!!
仅仅用了63ms就解出来了!!!
截图如下:
不要以为,只是写了一个改变文本框和弹出对话框的东西
感兴趣可以自己下载源文件扒一扒看
高富帅通道:
论坛注册已经两年多了
积分才25,希望大家多多支持{:17_1067:}
http://attach.52pojie.cn/forum/201703/14/175419wyaribrkkrxz5kn5.png
屌丝通道:https://pan.baidu.com/s/1bptKQlh密码:der3
这个题目不是特别严谨,比如第四题,“哪两道题的答案相同”,是不是暗示其他的两两的答案都不同呢?没有说明确。楼主给的确实是一个答案,但是楼主可以参考一下下面的答案,是不是也满足要求?
2, 4, 4, 2, 2, 4, 4, 2, 2, 2
我是写了一个C#的程序,用的就是最朴素的算法,并没有非常考虑性能问题。
void Main()
{
for (int q1 = 1; q1 <= 4; q1++)
{
for (int q2 = 1; q2 <= 4; q2++)
{
for (int q3 = 1; q3 <= 4; q3++)
{
for (int q4 = 1; q4 <= 4; q4++)
{
for (int q5 = 1; q5 <= 4; q5++)
{
if ((q2 == 1 && q5 != 3) ||
(q2 == 2 && q5 != 4) ||
(q2 == 3 && q5 != 1) ||
(q2 == 4 && q5 != 2))
{
continue;
}
if (q4 == 1 && q1 != q5)
{
continue;
}
if (q5 == 2 && q5 != q4)
{
continue;
}
for (int q6 = 1; q6 <= 4; q6++)
{
if ((q3 == 1) && (q3 == q6 || q3 == q2 || q3 == q4))
{
continue;
}
if ((q3 == 2) && (q6 == q3 || q6 == q2 || q6 == q4))
{
continue;
}
if ((q3 == 3) && (q2 == q3 || q2 == q6 || q2 == q4))
{
continue;
}
if ((q3 == 4) && (q4 == q3 || q4 == q6 || q4 == q2))
{
continue;
}
for (int q7 = 1; q7 <= 4; q7++)
{
if (q4 == 2 && q2 != q7)
{
continue;
}
if (q5 == 4 && q5 != q7)
{
continue;
}
for (int q8 = 1; q8 <= 4; q8++)
{
if (q5 == 1 && q5 != q8)
{
continue;
}
if (q6 == 1 && ((q2 != q4 || q4 != q8 || q2 != q8)))
{
continue;
}
if (q6 == 2 && ((q1 != q6 || q1 != q8 || q6 != q8)))
{
continue;
}
if ((q8 == 1 && (Math.Abs(q7 - q1) == 1)) ||
(q8 == 2 && (Math.Abs(q5 - q1) == 1)) ||
(q8 == 3 && (Math.Abs(q2 - q1) == 1)))
{
continue;
}
for (int q9 = 1; q9 <= 4; q9++)
{
if (q4 == 3 && q1 != q9)
{
continue;
}
if (q5 == 3 && q5 != q9)
{
continue;
}
if (q6 == 4 && ((q5 != q9 || q5 != q8 || q9 != q8)))
{
continue;
}
if (q9 == 1 && ((q1 == q6) == (q6 == q5)))
{
continue;
}
if (q9 == 3 && ((q1 == q6) == (q2 == q5)))
{
continue;
}
if (q9 == 4 && ((q1 == q6) == (q9 == q5)))
{
continue;
}
for (int q10 = 1; q10 <= 4; q10++)
{
if (q4 == 4 && q6 != q10)
{
continue;
}
if (q6 == 3 && ((q3 != q10 || q3 != q8 || q10 != q8)))
{
continue;
}
if (q8 == 4 && (Math.Abs(q10 - q1) == 1))
{
continue;
}
if (q9 == 2 && ((q1 == q6) == (q10 == q5)))
{
continue;
}
int[] a = { q1, q2, q3, q4, q5, q6, q7, q8, q9, q10 };
int repeat_max = a.GroupBy(s => s).OrderByDescending(s => s.Count()).Select(s => s.Count()).First();
int repeat_min = a.GroupBy(s => s).OrderByDescending(s => s.Count()).Select(s => s.Count()).Last();
int repeat_min_item = a.GroupBy(s => s).OrderByDescending(s => s.Count()).Last().Key;
if ((q10 == 1 && (repeat_max - repeat_min) != 3) ||
(q10 == 2 && (repeat_max - repeat_min) != 2) ||
(q10 == 3 && (repeat_max - repeat_min) != 4) ||
(q10 == 4 && (repeat_max - repeat_min) != 1))
{
continue;
}
if ((q7 == 1 && repeat_min_item != 3) ||
(q7 == 2 && repeat_min_item != 2) ||
(q7 == 3 && repeat_min_item != 1) ||
(q7 == 4 && repeat_min_item != 4))
{
continue;
}
Console.WriteLine(q1);
Console.WriteLine(q2);
Console.WriteLine(q3);
Console.WriteLine(q4);
Console.WriteLine(q5);
Console.WriteLine(q6);
Console.WriteLine(q7);
Console.WriteLine(q8);
Console.WriteLine(q9);
Console.WriteLine(q10);
Console.WriteLine("=====================================");
}
}
}
}
}
}
}
}
}
}
} 表示没看明白!!!!!!!!!!!!! 不明觉厉 感谢分享 有点费脑。。。 他是网易的 看不懂咋怎{:1_907:} 有点蒙啊试试 谢谢分享