有人能告诉我如何从下面的问题开始吗?(复制自链接中的练习3:https://wiki.ittc.ku.edu/ittc/EECS168:Lab14)
我想过生成排列,并检查它们是否可以通过交换2个相邻位置来获得,然后链接和计数它们,但这一切似乎都很复杂。我使用的编程语言是C++。任何想法都会有很大帮助。谢谢
重新排列纸箱
你们学校订购了一些装在一些很重的纸箱里的设备。每个纸箱都有一个序列号,纸箱都排成一排。不幸的是,你的老师要求把纸箱按特定的顺序放置,而你却忘了告诉卸纸箱的人。你现在必须迅速将纸箱恢复到正确的顺序,然后老师才能看到你把她的指示搞砸了。由于纸箱很重,你不能长途搬运。在每一步中,你所能做的就是交换两个相邻纸箱的位置。例如,假设纸箱上的序列号按卸载顺序为34、29、12、78和90,纸箱的排列顺序为90、29、78、34、12。这些纸箱可以按照所需的顺序重新排列,最少更换7个或更多,如下所示:
• Exchange 78, 90 — 34, 29, 12, 90, 78 • Exchange 12, 90 — 34, 29, 90, 12, 78 • Exchange 34, 29 — 29, 34, 90, 12, 78 • Exchange 12, 78 — 29, 34, 90, 78, 12 • Exchange 34, 90 — 29, 90, 34, 78, 12 • Exchange 29, 90 — 90, 29, 34, 78, 12 • Exchange 34, 78 — 90, 29, 78, 34, 12
在这个例子中,可以看出,根据需要重新订购纸箱至少需要7次交换。您需要重新排列它们,并报告您与相邻纸箱所需的交换次数(不一定是最小值),以获得所需订单。
输入格式:第一行输入的是单个整数N,纸箱总数。第二行由N个不同的正整数组成,用空格分隔,表示N个纸箱的序列号(按卸载顺序)。第三行是N个整数的另一个序列,表示N个纸箱应该重新排列的所需顺序。第三行中的数字序列保证是第二行中的序列的置换。
输出格式:输出应为单个整数,即实现所需纸箱序列所需的交换次数。这里是与上面讨论的示例相对应的样本输入和输出。
Sample input: 5 34 29 12 78 90 90 29 78 34 12 Sample output: 7
注意:程序不应打印输出格式中指定的内容以外的任何内容。请在最后提交之前删除所有诊断打印语句。
显然,您不需要报告最小掉期数量,只需要任何足够数量的掉期。这让人想到两种策略:
- 忽略输入的第二行和第三行,立即打印N^2并返回。从技术上讲,这符合规范!但你无法向审计员证明,用N^2步来安排纸箱是可能的。事实上,您可能有错误的奇偶校验。所以,如果你想不那么狡猾
- 找到应该放在第一个位置的纸箱,把它换到左边,直到它到达那里。找到应该放在第二个位置的纸箱,把它换到左边,直到它到达那里。重复直到完成。跟踪步骤并在最后报告。这可能不是最佳的,但它应该不会太难编码