2015-10-30 3 views
0

Я хочу сделать обобщенный маршрут, как в игре (https://www.youtube.com/watch?v=3ie4Z2odRjU). Цель состоит в том, чтобы получить возможную (не обязательно оптимальную) последовательность, делающую данную матрицу 4x3, состоящую полностью из 1s.Как преобразовать матрицу, состоящую полностью из 1?

Правила: у вас есть кнопки, окружающие матрицу. Каждый раз, когда вы нажимаете кнопку, относительная строка/столбец/диагональ переключает 0s на 1s (и наоборот). Предположим, что заданы только разрешимые матрицы. Например (серый равно 0):

m=matrix(c(1,0,1,1,0,1,1,1,0,0,0,1), nr=4) 
1 0 0 
0 1 0 
1 1 0 
1 1 1 

enter image description here enter image description here

Матрица преобразуется с помощью кнопок 8,9,7,6,6,5,4,1 к матрице, состоящей только из 1. Таким образом, желаемый результат: c (8,9,7,6,6,5,4,1)

Я полагаю, что два ядра должны выразить алгоритм, преобразующий 0 и 1 друг в друга (возможно, вместе с рекурсия? Я не знаю.), и для выражения операций (в этом случае есть 10 операций, потому что входная матрица 4 на 3) во всяком случае, которые кажутся мне выше моих возможностей.

+3

Я предполагаю, что вы отправили аналогичный вопрос раньше. – akrun

+0

Я смирился с решением случая матриц 4X3, и если я не могу даже решить этот частный случай, я сдаюсь. – kmee

+2

Просто интересно, почему вам нужно дважды щелкнуть на кнопке 6. –

ответ

0
f <- list(`1` = function(x) {diag(x) <- !diag(x); x}, 
      `2` = function(x) {x[1,] <- !x[1,]; x}, 
      `3` = function(x) {x[2,] <- !x[2,]; x}, 
      `4` = function(x) {x[3,] <- !x[3,]; x}, 
      `5` = function(x) {x[4,] <- !x[4,]; x}, 
      `6` = function(x) {x[4,1] <- !x[4,1]; x[3,2] <- !x[3,2]; x[2,3] <- !x[2,3]; x}, 
      `7` = function(x) {x[,1] <- !x[,1]; x}, 
      `8` = function(x) {x[,2] <- !x[,2]; x}, 
      `9` = function(x) {x[,3] <- !x[,3]; x}, 
      `10` = function(x) {diag(x[-1,]) <- !diag(x[-1,]); x}) 

exef <- function(mat, action_vector) { 
    require("magrittr") 
    paste0("mat %>% f$`", paste(action_vector, collapse = "`(.) %>% f$`"), "`(.)") %>% 
    parse(text = .) %>% eval 
} 

all_possible_actions_list <- lapply(1:10, function(i) { 
    actions <- combn(1:10, i) 
    unname(split(t(actions), 1:ncol(actions))) 
    }) %>% unlist(recursive = F) 

msolution <- function(m) { 
    for (k in 1:length(all_possible_actions_list)) { 
    if (sum(exef(m, all_possible_actions_list[[k]])) == 12) break 
    } 
    all_possible_actions_list[[k]] 
} 

msolution(m) 
# 1 2 3 
Смежные вопросы