【发布时间】:2012-09-11 00:44:18
【问题描述】:
我和一个朋友正在思考一个有趣的计算机科学问题。
你有一个简单的二维数组:
[ 1, 2, 3, 4 ]
[ 5, 6, 7, 8 ]
[ 9, 10, 11, 12 ]
[ 13, 14, 15, 16 ]
现在取这个数组并打乱数组中的所有元素:
[ 11, 5, 14, 10 ]
[ 8, 2, 4, 16 ]
[ 15, 1, 3, 13 ]
[ 6, 12, 9, 7 ]
起初是一个相当简单的概念。但是,如果我们再迈出一步会怎样?现在,打乱原始数组,使新数组的没有个元素紧挨着它们在原始数组中相邻的项目大方向。
我们的第一次洗牌失败,因为 1 在 2 旁边,并且在原始数组中也在 2 旁边。
这是一个工作示例:
[ 7, 16, 13, 2 ]
[ 14, 3, 5, 8 ]
[ 9, 1, 4, 11 ]
[ 12, 10, 15, 6 ]
还不算太不好。现在来回答真正的问题!
再次打乱原始数组,使数组中的没有个元素紧挨着它们在基本方向或通过对角线相邻的元素强>。
我们的工作示例失败,因为 1 在对角线上靠近 5,并且在原始数组中靠近 5。
一些想法:
- 甚至可以确定一个数组吗?
- 是否取决于数组的大小?
- 阵列是否需要对称?
- 数组是否需要包含偶数/奇数个元素?
- 解决方案是否适用于所有大小为 M by N 的数组?
- 如果存在解决方案,找到新阵列的运行时间是多少?
你怎么看?
编辑
我很惊讶地发现我的问题被关闭为“离题”。根据FAQ,如果我的问题“......通常涵盖特定的编程问题......”那么它是允许被问到的并且不是“离题”。
我要问的底线问题是:
“你能拿一个二维数组并打乱它,这样新数组中的成员就不会彼此相邻,包括对角线”。
这不是一个好的编程问题吗?我强烈认为我的问题不应该结束。
【问题讨论】:
-
对#2 的回答显然是肯定的。 2x2 数组没有解。
-
一个 3x3 数组也没有解,因为中间的数字本来就和所有其他数字相邻。
-
一个简单的 90 度旋转可能会做你想要的。元素不会与原始元素水平相邻,也不会是对角线。如果仍然以原始方式读取数组,则有效地洗牌。
-
这让我有点崩溃。我会纠结一会儿。以 (2,6) 对为例,我认为邻接规则不环绕左/右和上/下。
-
最小尺寸为 4x4。我的回答只有在您将其应用于现实世界的情况时才有效。如果您正在寻找“洗牌”的解决方案,这要复杂得多。
标签: arrays complexity-theory theory shuffle computation-theory