1 ~ n までの数字が 1 つずつ書かれた n 枚のカードがある。
先頭のカードの数字を見て,その数字の枚数分を先頭から上下逆さに変え,最初の解-度を末尾に移動するということを繰り返す。
操作の途中で,全てのカードが上下逆になるような場合もあるし,カードの状態がループし,全てのカードが上下逆になることはないこともある。
全てのカードが上下逆になるような最初の並び順は何通りあるか。
n = 3 のときは,1,2,3 の並び順の場合は全て上下逆になるが,1,3,2 の場合は,全て上下逆になることはなくループに陥る。
allReverse = function(n) {
func = function(x) {
rev = logical(n)
x0 = x
repeat {
rev[1:x[1]] = !rev[1:x[1]]
x = c(x[2:n], x[1])
rev = c(rev[2:n], rev[1])
if (all(rev))
return(TRUE)
else if (all(x == x0) && all(rev == FALSE))
return(FALSE)
}
}
library(e1071)
a = permutations(n)
pos = apply(a, 1, func)
invisible(list(count = nrow(a[pos, ]), pattern = a[pos, ]))
}
allReverse(7)$count
※コメント投稿者のブログIDはブログ作成者のみに通知されます