Есть несколько способов, чтобы перетасовать колоду карт. Одним из таких примеров является перетасовка для японской карточной игры “Ханафуда”. Ниже показано, как ее выполнить.
Имеется колода из 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]);
}
}
}