阵列相邻位置交换程序需要提示

时间:2014-01-17 05:33:53

标签: c++ sorting swap

任何人都可以给我一个提示如何从下面的问题开始? (它是从练习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
     

注意:您的程序不应打印除输出格式中指定的内容以外的任何内容。请在最终提交之前删除所有诊断打印报表。

1 个答案:

答案 0 :(得分:-1)

显然,您不需要报告最小次数,只需任何足够数量的掉期。这让我想到了两个策略:

  1. 忽略第二行和第三行输入,并立即打印N ^ 2并返回。从技术上讲,这符合规范!但是你无法向审核员证明可以用完全 N ^ 2步骤来安排纸箱。实际上,您可能错了parity。所以,如果你想减少鬼鬼祟祟......
  2. 找到应该在第一个位置进入的纸箱,并将其交换到左侧,直到它到达那里。找到应该在第二个位置进入的纸箱,并将其交换到左侧,直到它到达那里。重复直到完成。跟踪步骤并在最后报告。这可能不是最优的,但编码应该不会太难。