同じ数同士左から順に線で結んだとき、交点ができるか否かの判定について
昨日質問した
同じ数同士線で結んだとき、交点ができるか否かの判定について
の一般化を考えてみました。
ary1 = [1, 1, 2, 3, 3, 3, 2, 2, 1]
を考えることにします。
1と1を左から順番に飛ばさず上側で結びます。
同様に2と2を、3と3を飛ばさず上側で結びます。
(無理やり結んだ曲線を交差させないかぎり)
交点は0個です。
一方
ary2 = [1, 1, 3, 2, 3, 3, 2, 2, 1]
を考えることにします。
ary1 で行った操作を行うと
交点ができます。
このように、
ary の中に1~nまでの数字がk個ずつあり、
同じ数字同士左から順番に飛ばさず上側で結んだとき、
交点ができるか否かの判定をするには
どうすればいいでしょうか?
とりあえず、
同じ数同士線で結んだとき、交点ができるか否かの判定について
のunarist さんの回答を元に以下のようなコードを書いてみました。
def test_intersect(ary, n, k)
c_ary = Array.new(n, 0)
stack = []
ary.each{|i|
if stack.last == i && c_ary[i - 1] == k - 1
stack.pop
else
c_ary[i - 1] += 1
stack << i if stack.last != i
end
}
stack == []
end
p test_intersect([1, 3, 3, 2, 2, 1], 3, 2)
p test_intersect([1, 3, 2, 3, 2, 1], 3, 2)
p test_intersect([1, 1, 2, 3, 3, 3, 2, 2, 1], 3, 3)
p test_intersect([1, 1, 3, 2, 3, 3, 2, 2, 1], 3, 3)
p test_intersect([1, 1, 1, 2, 2, 3, 3, 3, 3, 2, 2, 1], 3, 4)
p test_intersect([1, 1, 1, 2, 3, 2, 3, 3, 3, 2, 2, 1], 3, 4)