UVa 12657 - Boxes in a Line 题解

UVa12657

代码仓库

12657.cc

本题的题意并不难理解,主要就是对链表移动、交换和倒序操作。在对链表节点的操作时需要非常小心,否则将需要花很长的时间来进行调试。而在对链表的这三种操作中,交换是需要特别注意的。我就在做这题的时候忘记了考虑两个箱子相邻时交换的情况,导致花了相当长的时间来调试。而且两个箱子相邻的情况下又需要分两种考虑,你需要考虑两个箱子之间的顺序,而我索性就将其中的一种转化成另一种进行交换操作。

if (b[op2].next == op1)
{
    int tmp = op2;
    op2 = op1;
    op1 = tmp;
}

值得一提的还有对链表倒序的操作上,一个倒序的操作就需要操作每个节点的指针,对于长的链表来说开销也是很大的。于是乎,我们bool类型的变量来标记这一串链表是否反转。

if (command == 4) //reverse
{
    reverse = !reverse;
}

由此,我们后面的移动操作和结果累加都需考虑这一串链表是否反转了。

command--;//2 to ture //1 to false
if (reverse)
    command = !command;

有偶数个节点且反转的话,从第2个节点开始累加。

if (n % 2 == 0 && reverse)
    r = b[0].next;
else
    r = 0;
for (int i = 0; i != size; i++)
{
    ans += b[r].next;
    r = b[b[r].next].next;
}
posted @ 2021-03-01 21:55  ithepug  阅读(68)  评论(0编辑  收藏  举报