Problem:
バス路線

図 1のようなバス路線があります。停留所は 10 箇所で、それぞれ 0〜9 の番号がついています。バスは停留所 0 では折り返しますが、反対側は循環路線になっており、図のように 5→6→7→8→9→5 の順で循環します。

このバス路線について、乗車する停留所と降車する停留所を入力とし、乗車から降車までに通る停留所の番号を出力するプログラムを作成してください。

ただし、1〜5 の停留所では 2 方向のバスに乗車できますが、より短い経路で降車停留所に到着するバスに乗車することとします。例えば、停留所 4 から停留所 2 へ行く場合、左方向に進むバスに乗り「4→3→2」の経路を通ります。また、一度バスに乗車したら途中下車はしないものとします。同じ停留所を乗車停留所、降車停留所に指定することはありません。

Input

複数のデータセットが与えられます。一行目にデータセット数 n (n ≤ 20 ) が与えられます。各データセットとして、乗車する停留所番号と降車する停留所番号が空白区切りで１行に与えられます。

Output

各データセットに対して、通過する停留所番号の並びを空白区切りで１行に出力してください。

Sample Input

2
2 4
4 2

Output for the Sample Input

2 3 4
4 3 2

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AOJ
{
    class Program
    {
        static readonly int[] stops_ = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 5, 4, 3, 2, 1 };
        static readonly int nInvalidStops_ = stops_.Length + 1;

        static int checkLoop(int stopNoGetOff, ref List<int> result, int iCurrent)
        {
            for (; ; )
            {
                var iNext = (iCurrent + 1) % stops_.Length;
                var next = stops_[iNext];
                result.Add(next);
                if (stopNoGetOff == next)
                {
                    return result.Count;
                }
                iCurrent = iNext;
            }
        }
        static int traverseInner(int stopNoGetOff, ref List<int> result, int iCurrent)
        {
            var iNext = (iCurrent + 1) % stops_.Length;
            var next = stops_[iNext];
            result.Add(next);
            if (stopNoGetOff == next)
            {
                return result.Count;
            }
            return traverseInner(stopNoGetOff, ref result, iNext);
        }
        static int traverse(int stopNoGetOn, int stopNoGetOff, ref List<int> result)
        {
            int count = nInvalidStops_;   // 最小の結果を返したい
            for (int i = 0; i < stops_.Length; ++i)
            {
                if (stops_[i] == stopNoGetOn)
                {
                    List<int> temp = new List<int>();
                    temp.Add(stopNoGetOn);
#if true
                    var tempCount = traverseInner(stopNoGetOff, ref temp, i);
#else
                    var tempCount = checkLoop(stopNoGetOff, ref temp, i);
#endif
                    if (tempCount < count)
                    {
                        result = temp;
                        count = temp.Count;
                    }
                }
            }
            return result.Count;
        }
        static void Main(string[] args)
        {
            var count = int.Parse(Console.In.ReadLine());
            for (int i = 0; i < count; ++i)
            {
                var inputs = Console.In.ReadLine().Split(' ');
                var istopGetOn = int.Parse(inputs[0]);
                var istopGetOff = int.Parse(inputs[1]);

                var resultLeft = new List<int>();
                var countLeft = traverse(istopGetOn, istopGetOff, ref resultLeft);

                var resultRight = new List<int>();
                var countRight = traverse(istopGetOn, istopGetOff, ref resultRight);

                List<int> result;
                if (countLeft == 0 && countRight == 0)
                {
                    throw new Exception("乗り降りできない");
                }

                if (countLeft < countRight)
                {
                    result = resultLeft;
                }
                else
                {
                    result = resultRight;
                }

                Console.Out.WriteLine(string.Join(" ", result.ToArray()));
            }
        }
    }
}