问题
想象一下,连续排着7个水桶。每个存储桶最多可包含2个苹果。有13个标记为1到13的苹果。它们分布在7个桶中。例如,
{5,4}, {8,10}, {2,9}, {13,3}, {11,7}, {6,0}, {12,1}
其中0代表空白。苹果在 每个存储桶中的出现顺序无关紧要(例如{5,4}等同于{4,5})。
您可以将任何一个苹果从一个存储桶移动到相邻的存储桶,只要目标存储桶中有另一个苹果的空间。每一步都由您要移动的苹果的数量来描述(这是明确的,因为只有一个空白空间)。例如,应用移动
7
以上安排将导致
{5,4}, {8,10}, {2,9}, {13,3}, {11,0}, {6,7}, {12,1}
目的
编写一个程序,从STDIN读取一个排列并将其分类为以下排列
{1,2}, {3,4}, {5,6}, {7,8}, {9,10}, {11,12}, {13,0}
使用尽可能少的动作。同样,在苹果的出现顺序 中每个桶是不相关的。桶的顺序很重要。它应该输出用于对用逗号分隔的每个排列进行排序的动作。例如,
13, 7, 6, ...
您的分数等于解决以下安排所需的举动总数之和:
{8, 2}, {11, 13}, {3, 12}, {6, 10}, {4, 0}, {1, 7}, {9, 5}
{3, 1}, {6, 9}, {7, 8}, {2, 11}, {10, 5}, {13, 4}, {12, 0}
{0, 2}, {4, 13}, {1, 10}, {11, 6}, {7, 12}, {8, 5}, {9, 3}
{6, 9}, {2, 10}, {7, 4}, {1, 8}, {12, 0}, {5, 11}, {3, 13}
{4, 5}, {10, 3}, {6, 9}, {8, 13}, {0, 2}, {1, 7}, {12, 11}
{4, 2}, {10, 5}, {0, 7}, {9, 8}, {3, 13}, {1, 11}, {6, 12}
{9, 3}, {5, 4}, {0, 6}, {1, 7}, {12, 11}, {10, 2}, {8, 13}
{3, 4}, {10, 9}, {8, 12}, {2, 6}, {5, 1}, {11, 13}, {7, 0}
{10, 0}, {12, 2}, {3, 5}, {9, 11}, {1, 13}, {4, 8}, {7, 6}
{6, 1}, {3, 5}, {11, 12}, {2, 10}, {7, 4}, {13, 8}, {0, 9}
是的,每种安排都有解决方案。
规则
- 您的解决方案必须以每次移动的存储桶数的多项式时间运行。关键是要使用巧妙的启发式方法。
- 所有算法必须是确定性的。
- 如果出现平局,则以最短的字节数为准。