这个题目不是特别严谨,比如第四题,“哪两道题的答案相同”,是不是暗示其他的两两的答案都不同呢?没有说明确。楼主给的确实是一个答案,但是楼主可以参考一下下面的答案,是不是也满足要求?
2, 4, 4, 2, 2, 4, 4, 2, 2, 2
我是写了一个C#的程序,用的就是最朴素的算法,并没有非常考虑性能问题。
[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("=====================================");
}
}
}
}
}
}
}
}
}
}
} |