Тасование Ханафуда

Есть несколько способов, чтобы перетасовать колоду карт. Одним из таких примеров является перетасовка для японской карточной игры “Ханафуда”. Ниже показано, как ее выполнить.

Имеется колода из n карт. Начиная с p-ой карты сверху, c карт вынимаются и кладутся на вершину колоды. Такую операцию назовем операциею срезки.

Напишите программу, которая моделирует перетасовку Ханафуда, и выведет номер карты, которая в конце будет находиться наверху.

Входные данные

Состоит из нескольких тестов. Каждый тест начинается со строки, содержащей два натуральных числа n (1 ≤ n ≤ 50) и r (1 ≤ r ≤ 50) - количество карт в колоде и количество операций срезания.

Каждая из следующих r строк описывает операцию срезания. Они выполняются в перечисленном порядке. Каждая строка содержит два натуральных числа p и c (p + c ≤ n + 1). Начиная с p-ой карты сверху, c карт вытаскиваются и кладутся наверх.

Последняя строка содержит два нуля.

Выходные данные

Для каждого теста вывести в отдельной строке номер верхней карты после выполнения тасования. Считайте, что сначала карты пронумерованы числами от 1 до n снизу доверху.

Алгоритм решения задачи

  • Выполняем операции пока на вход не получим два нуля;
  • Читаем n и r;
  • Заполняем список начальными данными;
  • С помощью LINQ выполняем перетасовку Ханафуда.

Решение

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            var prts = Array.ConvertAll(Console.ReadLine().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries),
              s => int.Parse(s));

            var n = prts[0];
            var r = prts[1];

            if (n == 0 && r == 0)
                return;

            var list = new List<int>();
            for (var i = n; i >= 1; i--)
            {
                list.Add(i);
            }

            for (var i = 0; i < r; i++)
            {
                prts = Array.ConvertAll(Console.ReadLine().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries),
                s => int.Parse(s));
                var p = prts[0] - 1;
                var c = prts[1];

                var tmpList = new List<int>();

                tmpList.AddRange(list.Skip(p).Take(c));
                tmpList.AddRange(list.Take(p));
                tmpList.AddRange(list.Skip(p + c));

                list = tmpList;
            }

            Console.WriteLine(list[0]);
        }
    }
}

Смотрите также: