Problem : Policz liczbę otworów w połączonym wielokącie. Łączność wielokąta jest gwarantowana pod warunkiem, że każdy trójkąt w triangulacji wejściowej dzieli co najmniej 1 bok z innym trójkątem i że istnieje tylko jeden taki połączony zestaw trójkątów.
Wejście znajduje się lista L
z n
punktów płaszczyzny, a także wykaz T
3-krotki z wpisami z 0...n-1
. Dla każdego elementu w T
krotce (t_1,t_2,t_3)
reprezentuje trzy wierzchołki (z listy L
) trójkąta w triangulacji. Zauważ, że jest to triangulacja w sensie „triangulacji wielokąta” , z tego powodu nigdy nie będzie dwóch trójkątów na T
tym zachodzeniu. Dodatkowym zastrzeżeniem jest to, że nie będziesz musiał dezynfekować danych wejściowych L
i T
nie będzie zawierał żadnych powtórzeń.
Przykład 1 : Jeśli L = {{0,0},{1,0},{0,1},{1,2}}
i T = {{0,1,2},{1,2,3}}
wtedy podany wielokąt ma liczbę otworów równą 0.
Przykład 2 : Jeśli L = {{0,0},{1,0},{2,0},{2,1},{2,2},{1,2},{0,2},{0,1},{.5,.5},{1.5,.5},{1.5,1.5},{.5,1.5}}
i T = {{5,6,11},{5,10,11},{4,5,10},{3,8,10},{2,3,9},{2,8,9},{1,2,8},{0,1,8},{0,8,11},{0,7,11},{6,7,11},{3,4,10}}
wtedy wejście wielokąta powinno dać wynik 2.
Zadanie polega na napisaniu najkrótszy program (lub funkcja), która pobiera L
i T
jako wejście i zwraca liczbę otworów. „Zwycięzca” zostanie uznany za zgłoszenie o najmniejszej liczbie znaków (wstępna data zakończenia 1 czerwca).
Przykładowe formatowanie wejściowe (zwróć uwagę na indeksowanie 0):
0,0
1,0
0,1
1,2
0,1,2
1,2,3
T=1,2,3/1,4,5
jest podłączony, ale nie podłączony do krawędzi)
T=1,2,3/1,2,4/5,6,7/5,6,8
. Każdy trójkąt dzieli krawędź z innym trójkątem, ale triangulacja jest rozłączona