2012-04-04 1 views
2

У меня есть матрица, и мне нужно найти шаблон внутри этой матрицы. Матрица:Как сделать этот алгоритм поиска паттерна?

1 0 0 1 1 1 0 0 0 1 
0 0 0 1 1 0 1 0 0 1 
0 1 1 1 0 0 0 1 0 1 
1 0 1 0 0 1 1 0 1 0 
1 1 1 0 0 0 1 1 0 1 
0 1 0 0 1 1 0 1 0 1 
1 1 1 0 0 0 1 0 0 1 
1 0 0 1 0 1 1 1 0 1 

Правила:

  1. Мы выбираем одно число из каждой строки.
  2. Следующее выбранное число из второй строки должно быть противоположным прецеденту.
  3. Позиции номеров, выбранных правилами 1 и 2, должны быть точными.

Так что вопрос будет:

Найти лучший образец, соблюдать 3 правила. Пример из матрицы показано:

  1. Choosed число: 0 (2) // то, что в "()" представляет положение начала value..position от 1 до 10 по строкам.
  2. 1 (4)
  3. Для позиций 2 и 4, которые должны быть шаблоном, должны поддерживать правила 1 и 2 для остальной части матрицы.

Итак, мы идем дальше на 3-й ряд, и мы проверяем 2-ю позицию: 1. Мы идем 4-й ряд, мы проверяем 4-ю позицию: 0. Кажется, соблюдают правила. На 2-й и 4-й позиции есть противоположные числа, поэтому мы продолжаем: 5-й ряд, 2-я позиция: и т. Д., Но вы увидите 7-й ряд 2-я позиция: 1 и 8-я строка 4-я позиция: 1; поэтому картина позиций 2-4 не является хорошей.

Как я могу создать алгоритм, основанный на этих правилах?

+3

Вы уже «создали» алгоритм. Я не понимаю, почему вы не просто кодируете свой список инструкций на своем любимом языке программирования и продолжаете работать с ним. Если вы застряли, или если вы считаете, что ваш алгоритм является субоптимальным (в некотором смысле), отправьте сообщение снова с кодом, и мы предоставим некоторую помощь. –

ответ

1

Возможно, это поможет (мотивировано комментарием к вашему вопросу). Это ответ на C++. Этот ответ предполагает, что 0 всегда является номером, который вы выбираете, но вы можете легко отредактировать его, чтобы 1 был первым.

int firstPos, secondPos; 

for(int i = 0; i < 10; ++i) 
    if(matrix[0][i] == 0) 
     firstPos = i; 

for(int i = 0; i < 10; ++i) 
    if(matrix[0][i] == 1) 
     secondPos= i; 

bool success = true; 

for(int i = 0; i < 10/2; ++i) 
    if(matrix[2*i][firstPos] == matrix[2*i][secondPos]) 
     success == false; 

if(success) 
    cout << "success" << endl; 
else 
    cout << "failure" << endl; 
0

Я бы определил шаблон по индексу первого элемента (F) и индекса второго элемента (S). Я также предполагаю, что индексы начинаются с 0 (вместо 1, как в вашем примере). Как F, так и S могут принимать значения от 0 до 9. Решение прост. Имейте двойной вложенный цикл, который запускает F и S от 0 до 9, а в третьем внутреннем цикле просто проверьте, что текущие F и S образуют шаблон.

Смежные вопросы