Шаблон блокування#6527

Шаблон блокування

1 секунда
64 мегабайти
Складна

Одним із способів блокування деяких телефонів є використання шаблону блокування. Щоб розблокувати телефон, потрібно намалювати секретний шаблон на сітці з певними точками, де шаблон складається з відрізків, що з'єднують ці точки.

Сітка шаблону вашого телефону складається з чотирьох рядків, у кожному з яких три точки. На наступному зображенні зліва показано представлення сітки, яке можна змоделювати як D площину з координатами та для кожної точки. Наприклад, верхня ліва точка має координати , а нижня права — . Зображення праворуч демонструє дійсний шаблон, який з'єднує точки в такому порядку: .

Дійсний шаблон має такі властивості:

  1. Шаблон може бути представлений послідовністю точок, яких він торкається вперше (у тому самому порядку, у якому малюється шаблон). Шаблон, що йде від до , не є тим самим, що йде від до .

  2. Для кожної пари послідовних точок і у представленні шаблону, якщо відрізок, що з'єднує і , проходить через інші точки, ці точки також повинні бути в послідовності і йти перед і , інакше шаблон буде недійсним. Наприклад, представлення шаблону, яке починається з , а потім , є недійсним, оскільки відрізок проходить через , яка не з'явилася в представленні шаблону перед , і правильне представлення для цього шаблону — це . Але шаблон є дійсним, оскільки з'явилася перед .

  3. У представленні шаблону ми не згадуємо ту саму точку більше одного разу, навіть якщо шаблон знову торкнеться цієї точки через інший дійсний відрізок, і кожен відрізок у шаблоні повинен йти від точки до іншої точки, якої шаблон ще не торкався, і він може проходити через деякі точки, які вже з'явилися в шаблоні.

  4. Довжина шаблону — це сума манхеттенських відстаней між кожною парою послідовних точок у представленні шаблону. Манхеттенська відстань між двома точками (X_1, Y_1) і (X_2, Y_2) — це |X_1 - X_2| + |Y_1 - Y_2| (де означає абсолютне значення ). Довжина шаблону на зображенні вище: 1 + 3 + 2 + 1 + 1 + 1 + 4 = 13.

  5. Шаблон повинен торкатися принаймні двох точок.

На жаль, ви забули шаблон вашого телефону, але пам'ятаєте довжину шаблону та набір точок , яких точно не торкається шаблон (точки, які не входять до , можуть торкатися або не торкатися шаблону), і ви вирішили спробувати всі дійсні шаблони, які відповідають тому, що ви пам'ятаєте. Перед тим, як це зробити, ви повинні написати програму, щоб підрахувати для вас кількість різних дійсних шаблонів.

Вхідні дані

Ваша програма буде протестована на одному або декількох тестових випадках. Перша строка введення містить одне ціле число , кількість тестових випадків (1 \leq T \leq 100). Далі йдуть тестові випадки: перша строка кожного тестового випадку містить два цілі числа і , розділені одним пробілом. (1 \leq L \leq 1000) — це довжина шаблону (як описано вище), а (0 \leq N \leq 12) — це кількість точок, яких, як ви впевнені, не торкається шаблон. Далі йдуть рядків, кожен з яких містить два цілі числа (1 \leq X \leq 3) і (1 \leq Y \leq 4), розділені одним пробілом, які представляють координати однієї з точок, яких точно не торкається шаблон. точок є різними.

Вихідні дані

Для кожного тестового випадку, якщо немає дійсних шаблонів відповідно до того, що ви пам'ятаєте, виведіть в одному рядку BAD MEMORY, інакше виведіть кількість різних дійсних шаблонів.

Приклади

Приклад 1

Loading
Loading